Предположим, у нас есть что-то преобразованное в 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!)?
Просто к сведению: с точной строкой, которую вы указали, UTF-8 и ASCII будут точно такими же.
Я имею в виду, что мне нужен общий метод, который работает со всеми строками utf8, а не только с ascii
Этого можно добиться, просто преобразуя двоичное представление в байты, если исходная строка была в UTF-8. Байты - это байты, кодировка символов не имеет значения.
ричи, как я могу это сделать?





Похоже, вы хотите преобразовать вывод 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.
спасибо, это работает !, но код на шаге 104 немного неясен ... не могли бы вы объяснить это, пожалуйста?
Строка ascii допустима в кодировке UTF-8, поэтому я не уверен, что вы имеете в виду под «(не ascii!)».