Portál AbcLinuxu, 5. května 2025 09:01

Dotaz: Jak zkonvertovat string obsahující escape sekvence na string?

Pavel Stárek avatar 11.8.2014 11:35 Pavel Stárek | skóre: 44 | blog: Tady bloguju já :-) | Kolín
Jak zkonvertovat string obsahující escape sekvence na string?
Přečteno: 549×
Odpovědět | Admin
Zdravím,

mám takový problém, googlím (asi blbě) a výsledek furt nemám. Píšu si utilitku, která jako jeden ze svých parametrů na příkazové stránce bere data jako string. Chtěl bych ale, pokud uživatel dá do toho stringu escape sekvenci aby se nejprve správně rozparsovala (nebo převedla na odpovídající bajty) do jiného stringu (nebo bafru v paměti), avšak nevím, jak na to. Tedy pokud uživatel zadá při spuštění:
utilita "\x02A\x03"
aby se to do jiného bafru převedlo na sekvenci bajtů 0x02, 0x41, 0x03 a 0x00. Existuje nějaká funkce v C která to udělá?
Kdo chce, hledá způsob; kdo nechce, hledá důvod.

Řešení dotazu:


Nástroje: Začni sledovat (3) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Josef Kufner avatar 11.8.2014 12:30 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak zkonvertovat string obsahující escape sekvence na string?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Na toto se používají konečné automaty. Jedná se o takovou věc, která to veme znak po znaku, přepíná podle toho svůj stav a podle svého stavu a vstupu produkuje výstup.

Viz zdejší seriál Jazyky a překladače.

Ve stručnosti chceš automat, který když je ve výchozím stavu a dostane lomítko, přejde do stavu mám-lomítko, pokud dostane cokoliv jiného, tak to vypíše. Pokud je ve stavu mám-lomítko a dostane cokoliv než 'x', tak to vypíše a přejde zpět do výchozího stavu. Pokud ale dostane 'x', tak při dalších dvou znacích přejde postupně dalšími děma stavy a v tom druhém vypíše odpovídající byte (a vrátí se do výchozího). Pokud mu přijde něco jiného, tak hodí chybu. K implementaci takto jednoduchých automatů stačí while se switchem nad stavovou proměnnou.
Hello world ! Segmentation fault (core dumped)
wamba avatar 11.8.2014 12:50 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Jak zkonvertovat string obsahující escape sekvence na string?
Odpovědět | | Sbalit | Link | Blokovat | Admin
neexistují v C příkazy printf (docela určitě existuje) a unpack (to se mi nepodařilo najít)? pak by šel napsat ekvivalent Perlovského
perl -E 'printf("%#.02x ", $_) for unpack("W*","\x02A\x03");'
#řádek, aby šlo vidět podtržítko
This would have been so hard to fix when you don't know that there is in fact an easy fix.
Pavel Stárek avatar 11.8.2014 13:23 Pavel Stárek | skóre: 44 | blog: Tady bloguju já :-) | Kolín
Rozbalit Rozbalit vše Re: Jak zkonvertovat string obsahující escape sekvence na string?
printf (sprintf) existuje, ale unpack asi ne. A tvé řešení by asi fungovalo, ale co kdybych tam chtěl vložit další hodnotu? Programovat si vlastní parser se mi nechce, tak se na to vyprdnu, ona ta utilitka (odesílač dat přes UDP broadcast) bude stejně jen moje interní, takže si naprogramuji ten "druhý konec" tak, jak potřebuji, a na tenhle výmysl zase rychle zapomenu :-) Třeba python má:
unescaped = "\x02DATA\x03".decode("string_escape")
Kdo chce, hledá způsob; kdo nechce, hledá důvod.
Josef Kufner avatar 11.8.2014 13:34 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak zkonvertovat string obsahující escape sekvence na string?
Ten parser je funkce asi na 30 řádek.
Hello world ! Segmentation fault (core dumped)
11.8.2014 18:33 luky
Rozbalit Rozbalit vše Re: Jak zkonvertovat string obsahující escape sekvence na string?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Proc to nespoustite jako
utilita "`printf \x02A\x03`"
Pavel Stárek avatar 11.8.2014 20:56 Pavel Stárek | skóre: 44 | blog: Tady bloguju já :-) | Kolín
Rozbalit Rozbalit vše Re: Jak zkonvertovat string obsahující escape sekvence na string?
Jo já zapoměl napsat, že utilitka bude spouštěna ve Windows. Snažím se jí napsat a překládat pomocí MingW a funkcí ze standardní C knihovny + Winsock. Ono už to funguje, jen by se mi líbilo mít tam tu možnost si do vstupních dat dát nějak rozumně jakýkoliv bajt.
Kdo chce, hledá způsob; kdo nechce, hledá důvod.
Josef Kufner avatar 11.8.2014 23:59 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak zkonvertovat string obsahující escape sekvence na string?
Příloha:
Tu máš a nekňourej.
$ gcc cstring-parse.c -o cstring-parse && ./cstring-parse 
"abc" = "abc"
"a\\bc" = "a\bc"
"a\x0abc" = "a
bc"
$ gcc cstring-parse.c -o cstring-parse -DDEBUG&& ./cstring-parse
START: a
START: b
START: c
"abc" = "abc"
START: a
START: \
SLASH: \
START: b
START: c
"a\\bc" = "a\bc"
START: a
START: \
SLASH: x
DIGIT1: 0
DIGIT2: a
START: b
START: c
"a\x0abc" = "a
bc"
... nezapomeň pak zavolat free().
Hello world ! Segmentation fault (core dumped)
Fuky avatar 12.8.2014 11:49 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Jak zkonvertovat string obsahující escape sekvence na string?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Přílohy:

g_strcompress()

$ make && ./main "\2A\03"
\2A\03 => ?A?
0x2
0x41
0x3
-- RÁMO: psí tábor , ETriatlon: Výuka plavání

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.