Проблема, которую вы наблюдаете, связана с кодировкой UTF-8 и little-endiannes.
Во-первых, обратите внимание, что когда вы пытаетесь напечатать любой символ Юникода в AWK, например 0xA4 (CURRENCY SIGN) , он фактически выдает два байта вывода, например, два байта 0xC2 0xA4, которые вы видите в своем выход:
$ echo 1 | awk 'BEGIN { printf("%c", 0xA4) }' | hexdump -C
Выход:
00000000 c2 a4 |..|
00000002
Это относится к любому символу больше 0x7F, и это связано с кодировкой UTF-8, которая, вероятно, установлена в вашей локали. (Примечание: некоторые реализации AWK будут иметь другое поведение для приведенного выше кода.)
Во-вторых, когда вы используете hexdump
без аргумента -C
, он отображает каждую пару байтов в порядке замены из-за little-endianness вашей машины. Это связано с тем, что каждая пара байтов затем обрабатывается как одно 16-битное слово вместо обработки каждого байта отдельно, как это делается с помощью команд xxd
и hexdump -C
. Таким образом, вывод xxd
, который вы получаете, на самом деле является правильным побайтным представлением ввода.
В-третьих, если вы хотите получить точную строку байтов, которая закодирована в шестнадцатеричной строке, которую вы передаете в sed, вы можете использовать это решение Python:
echo -n "a42d9dfe8f93515d0d5f608a576044ce4c61e61e" | sed 's/\(..\)/0x\1,/g' | python3 -c "import sys;[open('tmp','wb').write(bytearray(eval('[' + line + ']'))) for line in sys.stdin]" && cat tmp | xxd
Выход:
00000000: a42d 9dfe 8f93 515d 0d5f 608a 5760 44ce .-....Q]._`.W`D.
00000010: 4c61 e61e La..