Как получить двоичные представления строк в Shell?

Я использую openssl dgst -sha1 -binary для получения хэш-значений моих строк в двоичном формате.

(Я использую -binary флаг, потому что моя версия openssl добавляет «stdout» перед каждым значением хэш-функции по умолчанию, а -binary помогает избежать этого, поэтому легче хранить результаты хэша в двоичном формате для дальнейшей обработки (так что я могу просто используйте xxd -p когда мне нужны шестнадцатеричные значения вместо того, чтобы вручную вырезать « stdout » из каждой строки)

Итак, двоичный вывод openssl dgst -sha1 -binary для «Hello!» строка в консоли Cygwin будет выглядеть так: _▒▒ "q▒% ▒a▒▒▒▒. & C▒0N▒Q▒▒vH & 8i

Теперь я создаю новую переменную с этим результатом и объединяю ее с другой переменной, значение которой не в двоичном формате (т.е. «Мир»). Итак, теперь моя новая переменная выглядит

_▒▒ "q▒% ▒a▒▒▒▒. & C▒0N▒Q▒▒vH & 8iWorld

Затем я создаю еще один хэш для этой конкатенированной строки и сравниваю ее с той, которую я получил, используя стандартные хэш-библиотеки Java ( MessageDigest ). Однако на этом этапе хеши, полученные через оболочку и Java, не совпадают (и мне нужно получить то же значение, что и сгенерированное на стороне Java).

Поэтому я полагаю, что моя строка «World» также должна быть в двоичном формате, чтобы соответствовать моему хэш-выходу Java (поскольку до тех пор, пока я генерирую хэши для конкатенированных двоичных значений, все хэши совпадают). Тем не менее, я не знаю, как преобразовать строку «World» в двоичный формат в оболочке. Есть идеи?

  • Как выполнить команду find с помощью набора строк из строки в текстовом файле
  • Передача аргументов из файла в сценарий bash
  • Сценарий Bash для извлечения идентификатора сообщения и отправки силы
  • linux периодический скрипт проверки системы или утилита
  • использование scp переименование всех файлов
  • Ctrl-C игнорируется pppd при установке сценария оболочки
  • разделить линию на основе пробела и удалить вторую часть
  • как передать несколько команд в sqlite3 в одной команде оболочки liner
  • One Solution collect form web for “Как получить двоичные представления строк в Shell?”

    Вы не можете хранить двоичные данные (двоичные данные обычно ссылаются на данные с произвольными байтовыми значениями, а не только на байтовые значения, которые формируют допустимые символы, но не являются особыми) в bash переменных, поскольку bash не поддерживает сохранение значения байта 0 в его переменных (и помните, что вы не можете передавать такие строки в аргументах командам, поскольку это строки с разделителями NUL).

    Вы можете в zsh хотя. Также помните, что подстановки команд заменяют завершающие символы новой строки (0xa байты, возможно, разные на Cygwin), поэтому, вероятно, лучше использовать здесь:

     $ echo 323 | openssl dgst -sha1 -binary | hd 00000000 3a 8b 03 4a 5d 00 e9 07 b2 9e 0a 61 b3 54 db 45 |:..J]......aTE| 00000010 63 4b 37 b0 |cK7.| 00000014 

    Посмотрите, как он содержит как символ 0 и символ новой строки (0xa)

     $ echo 323 | openssl dgst -sha1 -binary | IFS= LC_ALL=C read -ru0 -k20 var && var=${var}World $ printf %s $var | hd 00000000 3a 8b 03 4a 5d 00 e9 07 b2 9e 0a 61 b3 54 db 45 |:..J]......aTE| 00000010 63 4b 37 b0 57 6f 72 6c 64 |cK7.World| 00000019 

    Заметим еще раз, что вы можете передать эту переменную только встроенным командам ( printf …).

    Теперь, если все, что вы хотите, это хэш, это снова, тогда это просто

     (echo 323 | openssl dgst -sha1 -binary; printf %s World) | openssl dgst -sha1 -binary 

    нет необходимости в переменной.

    Linux и Unix - лучшая ОС в мире.