Титла: Помощ с bash Публикувано от: philip_petev в Jul 05, 2012, 10:50 Здравейте, може ли някой да ми каже има ли начин с bash скрипт да се прави функцията byte flip, която я има повече по инженерните калкулатори, накратко имам 0x30e4 и търся резултат 0xe430, тоест да сменя местата на байтовете, а примерно 0x7ed да става 0xed07. Претърсих доста места в интернет, но не можах да намеря нещо което да ме насочи как може да стане това. Благодаря предварително.
Титла: Re: Помощ с bash Публикувано от: sudo в Jul 05, 2012, 12:22 Не казваш от къде четеш входящите данни и за това мога само да гадая, но като едно добро начало "dd conv=swab if=infputfile of=outputfile", другото което ми идва на ум е една миниатюрна програма на С където всичко е ясно.
Титла: Re: Помощ с bash Публикувано от: philip_petev в Jul 05, 2012, 12:56 Не казваш от къде четеш входящите данни и за това мога само да гадая, но като едно добро начало "dd conv=swab if=infputfile of=outputfile", другото което ми идва на ум е една миниатюрна програма на С където всичко е ясно. Входните данни ги дърпам в този вид, в който съм писал, от един dump с помощта на grep и sed. Идеята е да ги преобразува вътре в скрипта, а не да ползвам външни файлове за това. Това, което си написал, сменя местата, но на съседни байтове, а не това е условието на задачката. Титла: Re: Помощ с bash Публикувано от: sudo в Jul 05, 2012, 13:46 За да изясним докрай условието на задачата, ти имаш string който има стойност '0x30e4' или имаш binary data file в който има 30e4 (което са си точно 2 байта и ти ги искаш разменени) ?
Титла: Re: Помощ с bash Публикувано от: bop_bop_mara в Jul 05, 2012, 14:27 За да изясним докрай условието на задачата, ти имаш string който има стойност '0x30e4' или имаш binary data file в който има 30e4 (което са си точно 2 байта и ти ги искаш разменени) ?Първо да уточня, че в самия шел май имаш само сметки $((израз)) за елементарни аритметики с цели числа. Ако имаш нещо от сорта на str='0x30e4' (променлива, т.е. низ, на който искаш да разменяш буквите), поднизове в bash (като надмножество на POSIX възможностите) можеш да получаваш по схемата ${str:position:length}: Код
Ако имаш файл с два байта и искаш да ги размениш, може да пробваш head/tail с опцията -c (тя не е POSIX опция, има я в GNU варианата на програмата): Код
Надявам се това да ти даде някакви насоки :) Титла: Re: Помощ с bash Публикувано от: solarflux в Jul 05, 2012, 15:14 Здравейте, може ли някой да ми каже има ли начин с bash скрипт да се прави функцията byte flip, която я има повече по инженерните калкулатори, накратко имам 0x30e4 и търся резултат 0xe430, тоест да сменя местата на байтовете, а примерно 0x7ed да става 0xed07. Претърсих доста места в интернет, но не можах да намеря нещо което да ме насочи как може да стане това. Благодаря предварително.ако можеш да си гарантираш, че няма да има 0х7ed вместо 0х07ed можеш да ползваш: $ echo 0x30e4 | sed 's/.\{2\}/&\ /g' | awk '{ {printf "0x"} {for (i=NF; i>1; i--) printf "%s", $i," " } print ""}' 0xe430 $ echo 0x07ed | sed 's/.\{2\}/&\ /g' | awk '{ {printf "0x"} {for (i=NF; i>1; i--) printf "%s", $i," " } print ""}' 0xed07 Титла: Re: Помощ с bash Публикувано от: philip_petev в Jul 05, 2012, 16:31 За да изясним докрай условието на задачата, ти имаш string който има стойност '0x30e4' или имаш binary data file в който има 30e4 (което са си точно 2 байта и ти ги искаш разменени) ?Първо да уточня, че в самия шел май имаш само сметки $((израз)) за елементарни аритметики с цели числа. Да, моя е грешката, явно снощи ми е дошло малко повече пиенето, че днес навсякъде ги пиша едни... Как стоят нещата - с една команда вадя един дълъг лог (който си е чисто стрингов тип), след това в него търся реда който ми трябва с grep, след което резултата го филтрирам през sed и след като всичко това се изпълни в един ред (команда | grep критерий | sed 's/.*0x//'), крайния резултат е това въпросно DeviceID от вида 30e4, което се намира в края на въпросния ред и на което трябва да завъртя местата на байтовете (е430), след което да го обърна в стринг, но десетичната стойност (това обаче знам как става). Губеше ми се само обръщането, но явно съм забравил че това си е преди всичко стринг, а него мога да си го правя каквото си искам, има достатъчно оператори за това. Проблема е че това DeviceID може да бъде три или четири символа (и доколкото знам не може да е пет или повече символа, както и два или по-малко), като ако е от вида 7ed, трябва да се обърне на 0d7e, но и това се сетих как ще стане. В комбинация с един case за трите случая (при дължина 4, 3 или всичко останало, в който ще връща грешка) ще стане идеално. Благодаря на всички за отговорите, наистина ми бяха полезни за да се сетя какво да правя. Титла: Re: Помощ с bash Публикувано от: morbid_viper в Jul 05, 2012, 17:17 Абе има си и побитови операции в bash… но…
веднъж го ядох този, защото има значение дали си на 32-битова или 64-битова и с някои операции не получаваш точно желания резултат. лично аз писах едни алгоритми за преобразуване на IP адрес към целочислено и обратно, където масово се ползват побитови операции. така или иначе щом имаш низове за въртене, нещата са драматично по-прости… :-) Титла: Re: Помощ с bash Публикувано от: bop_bop_mara в Jul 05, 2012, 17:27 Губеше ми се само обръщането, но явно съм забравил че това си е преди всичко стринг, а него мога да си го правя каквото си искам, има достатъчно оператори за това. Проблема е че това DeviceID може да бъде три или четири символа (и доколкото знам не може да е пет или повече символа, както и два или по-малко), като ако е от вида 7ed, трябва да се обърне на 0d7e, но и това се сетих как ще стане. В комбинация с един case за трите случая (при дължина 4, 3 или всичко останало, в който ще връща грешка) ще стане идеално. Благодаря на всички за отговорите, наистина ми бяха полезни за да се сетя какво да правя.Да, то си има ${#string} за дължината на низа и другото са вече подробности (щом като имаш само два-три варианта за дължината на низа). Титла: Re: Помощ с bash Публикувано от: remotex в Jul 06, 2012, 02:46 7ed - 07ed - ed07
|