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

Предположим, у нас есть что-то преобразованное в 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!)?

Строка ascii допустима в кодировке UTF-8, поэтому я не уверен, что вы имеете в виду под «(не ascii!)».

rici 04.06.2018 17:32

Просто к сведению: с точной строкой, которую вы указали, UTF-8 и ASCII будут точно такими же.

Joachim Sauer 04.06.2018 17:32

Я имею в виду, что мне нужен общий метод, который работает со всеми строками utf8, а не только с ascii

Alex_DeLarge 04.06.2018 17:48

Этого можно добиться, просто преобразуя двоичное представление в байты, если исходная строка была в UTF-8. Байты - это байты, кодировка символов не имеет значения.

rici 04.06.2018 19:11

ричи, как я могу это сделать?

Alex_DeLarge 04.06.2018 20:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
493
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы хотите преобразовать вывод 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 немного неясен ... не могли бы вы объяснить это, пожалуйста?

Alex_DeLarge 04.06.2018 20:27

Другие вопросы по теме