Как получить двоичные представления строк в 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» в двоичный формат в оболочке. Есть идеи?

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 

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

  • Почему команда jobs не работает в сценарии оболочки?
  • Как удалить все файлы в каталоге, кроме одного файла в Solaris
  • Несколько входов в одной команде
  • сценарий не работает, как ожидалось, когда запланировано как cronjob
  • Производительность скрипта Bash
  • Расширение *, #,% - Что они означают?
  • Добавить в файлы
  • Как я могу подсчитать частоту строк среди многих файлов?
  • Bash: использование двухсторонних перенаправлений в сценарии оболочки
  • как установить кавычки вокруг переменной, чтобы программы рассматривали их как кавычки
  • Состояние выхода Bash, используемое с PIPE
  • Interesting Posts

    Ошибка установки PIL: SyntaxError: Отсутствие скобок в вызове 'print'

    Сетевой интерфейс не принимает кадры, если в режиме неразборчивости

    Экономически выгодно спаривать каждую строку файла со всеми остальными

    Существует ли совпадение в использовании PID и jobspec в Bash?

    Может кто-нибудь объяснить некоторые из этих кодов эвакуации?

    Изменение размера / корневой раздел

    Создайте рекурсивный каталог diff. Копировать ссылку и разницу. Восстановить исходный каталог

    Не удается получить доступ / передача

    Установил USB в / home и потерял все подкаталоги

    Несколько интерфейсов Lan на одной виртуальной машине вместо нескольких виртуальных машин

    Захват символической ссылки в переменные Unix / Linux

    Ошибка tkdiff в Linux Redhat 5.5

    Есть ли команда терминала, которая переходит в самый глубокий подкаталог в каталоге?

    Модули ядра VirtualBox не загружаются через systemd

    Как добавить «системный» локальный пользователь, такой как mysql или tomcat?

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