«xxd -b» может преобразовывать данные в битовые строки (например: «A» → «01000001»), но как сделать обратное? - PullRequest
0 голосов
/ 04 июня 2018

Предположим, что у нас есть что-то, преобразованное в utf8, из которого мы извлекаем двоичный файл, например:

echo "hello world" | xxd -p -b

, мы получаем такой вывод:

00000000: 01101000 01100101 01101100 01101100 01101111 00100000  hello 
00000006: 01110111 01101111 01110010 01101100 01100100 00001010  world.

с вырезом мы берем толькобиты:

01101000 01100101 01101100 01101100 01101111 00100000
01110111 01101111 01110010 01101100 01100100 00001010

есть ли способ отменить процесс и получить из этих битов строку utf8 (не ascii!)?

1 Ответ

0 голосов
/ 04 июня 2018

Похоже, вы хотите преобразовать вывод xxd -b обратно в исходную строку hello world?

[STEP 103] # echo hello, world | xxd -b 
00000000: 01101000 01100101 01101100 01101100 01101111 00101100  hello,
00000006: 00100000 01110111 01101111 01110010 01101100 01100100   world
0000000c: 00001010                                               .
[STEP 104] # echo hello, world | xxd -b                 \
             | sed -E -e 's/.*:(( [01]+){0,6}).*/\1/'   \
                      -e 's/ ([01]+)/ $((2#\1))/g'      \
             | xargs bash -c 'eval printf %02x "$@" ' _ \
             | xxd -p -r
hello, world
[STEP 105] #

(Вам необходимо обновить команду sed, если она не поддерживает -E.)

Шаг за шагом:

[STEP 106] # echo xyz | xxd -b
00000000: 01111000 01111001 01111010 00001010                    xyz.

[STEP 107] # echo xyz | xxd -b | sed -E -e 's/.*:(( [01]+){0,6}).*/\1/' \
                                        -e 's/ ([01]+)/ $((2#\1))/g'
 $((2#01111000)) $((2#01111001)) $((2#01111010)) $((2#00001010))

[STEP 108] # echo xyz | xxd -b | sed -E -e 's/.*:(( [01]+){0,6}).*/\1/' \
                                        -e 's/ ([01]+)/ $((2#\1))/g'    \
             | xargs bash -c 'echo printf %02x "$@" ' DOLLAR0
printf %02x $((2#01111000)) $((2#01111001)) $((2#01111010)) $((2#00001010))

[STEP 109] # printf %02x $((2#01111000)) $((2#01111001)) $((2#01111010)) $((2#00001010))
78797a0a

[STEP 110] # echo xyz | xxd -b | sed -E -e 's/.*:(( [01]+){0,6}).*/\1/' \
                                        -e 's/ ([01]+)/ $((2#\1))/g'    \
             | xargs bash -c 'eval printf %02x "$@" ' DOLLAR0
78797a0a

[STEP 111] # echo xyz | xxd -b | sed -E -e 's/.*:(( [01]+){0,6}).*/\1/' \
                                        -e 's/ ([01]+)/ $((2#\1))/g'    \
             | xargs bash -c 'eval printf %02x "$@" ' DOLLAR0 | xxd -p -r
xyz

[STEP 112] #

В STEP 108 я использовал echo вместо eval, чтобы вы могли увидеть, что на самом деле выдает команда xargs.

...