Подтвердить что ты не робот

Преобразование строки в шестнадцатеричную строку в командной строке

Я пытаюсь преобразовать "Hello" в 48 65 6c 6c 6f в шестнадцатеричном формате максимально эффективно, используя командную строку.

Я пробовал смотреть printf и google, но я никуда не могу.

Любая помощь очень ценится.

Большое спасибо заранее,

4b9b3361

Ответ 1

echo -n "Hello" | od -A n -t x1

Объяснение:

  • Программа echo предоставит строку для следующей команды.
  • Флаг -n говорит эхо не генерировать новую строку в конце "Hello".
  • Программа od является программой "восьмеричного дампа". (Мы предоставим флаг, который будет указывать, что он должен выводить шестнадцатеричный код вместо восьмеричного.)
  • Флаг -A n - это сокращение от --address-radix=n, а n - это "нет". Без этой части команда выведет уродливый префикс числового адреса на левой стороне. Это полезно для больших дампов, но для короткой строки это не нужно.
  • Флаг -t x1 является коротким для --format=x1, где x - это "шестнадцатеричный", а 1 означает 1 байт.

Ответ 2

По-видимому, @TMS не может RTFM. (см. его комментарии к его предыдущему ответу)

Если вы хотите сделать это и удалить необходимые пространства:

echo -n "Hello" | od -A n -t x1 | sed 's/ *//g'

Первые две команды в конвейере хорошо объясняются @TMS в его ответе, как отредактировано @James. Последняя команда отличается от комментария @TMS тем, что она исправлена ​​и была протестирована. Объяснение:

  • sed - это s tream ed итор.
  • s - это команда s ubstitute.
  • / открывает регулярное выражение - любой символ может использоваться. / обычное, но неудобное для обработки, скажем, XML или имена путей.
  • / или альтернативный символ, который вы выбрали, закрывает регулярное выражение и  открывает строку подстановки.
  • В / */ * соответствует любой последовательности предыдущего символа (в этом случай, пробел).
  • / или альтернативный символ, который вы выбрали, закрывает строку подстановки.  В этом случае строка подстановки // пуста, то есть совпадение  удален.
  • g - это возможность сделать эту подстановку g по-разному на каждой строке вместо  всего один раз для каждой строки.
  • Кавычки не дают путать интерпретатор команд - целое последовательность передается в sed в качестве первого параметра, а именно sed script.

@TMS brain child (sed 's/^ *//') только разделяет пробелы с начала каждой строки (^ соответствует началу строки - "пространство образца" в sed -speak).

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

| tr -d '\n'

в командные каналы. Он функционирует следующим образом:

  • | подает ранее обработанный поток на этот стандартный ввод команды.
  • tr - команда tr anslate.
  • -d указывает удаление символов соответствия.
  • В котировках перечислены ваши совпадающие символы - в этом случае только новая строка (\n). Перевод только соответствует одному символу, а не последовательностям.

sed имеет уникальную задержку при работе с символами новой строки. Это связано с тем, что sed является одной из старейших команд unix - она ​​была создана до того, как люди действительно знали, что они делают. Всепроникающее устаревшее программное обеспечение не позволяет фиксировать его. Я знаю это, потому что я родился до рождения unix.

Историческим происхождением проблемы была идея о том, что новая строка была разделителем строк, а не частью строки. Поэтому его лишили утилиты обработки строк и повторно вставляли выходные утилиты. Проблема в том, что это делает предположения о структуре пользовательских данных и налагает неестественные ограничения во многих настройках. sed Неспособность легко удалить символы новой строки является одним из наиболее распространенных примеров этой неверной идеологии, вызывающей горе.

Можно удалить новые строки с помощью sed - это просто, что все решения, которые я знаю о make sed, обрабатывают весь файл сразу, что задыхается для очень больших файлов, что лишает цель редактора потока. Любое решение, которое сохраняет обработку строк, если это возможно, будет нечитаемым гнездом крысы из нескольких каналов.

Если вы настаиваете на использовании sed try:

sed -z 's/\n//g'

-z сообщает sed использовать нули в качестве разделителей строк.

Внутренне строка в C завершается нулем. Опция -z также является результатом устаревших, предоставляемых в качестве удобства для программистов C, которым может потребоваться использование временного файла, заполненного C -строками и uncluttered новыми символами. Затем они могут легко читать и обрабатывать одну строку за раз. Опять же, ранние предположения о случаях использования налагают искусственные ограничения на пользовательские данные.

Если вы опустите параметр g, эта команда удаляет только первую строку новой строки. С опцией -z sed интерпретируется весь файл как одна строка (если в файл не включены пустые нули), завершается нулем, и поэтому это также зажимает большие файлы.

Вы можете подумать

sed 's/^/\x00/' | sed -z 's/\n//' | sed 's/\x00//'

может работать. Первая команда помещает нуль в начале каждой строки в строке за строкой, в результате \n\x00 заканчивается каждая строка. Вторая команда удаляет одну новую строку из каждой строки, теперь ограничена нулями - в силу первой команды будет только одна новая строка. Все, что осталось, это ложные нули. Все идет нормально. Разбитая идея здесь заключается в том, что труба будет кормить последнюю команду в строке за строкой, так как именно так был построен поток. Фактически, последняя команда, как написано, будет удалять только один null, так как теперь весь файл не имеет новых строк и, следовательно, является одной строкой.

Простая реализация канала использует промежуточный временный файл, и все входные данные обрабатываются и передаются в файл. Следующая команда может быть запущена в другом потоке, одновременно просматривая этот файл, но он просто видит поток в целом (хотя и неполный) и не знает о границах блоков, подающих файл. Даже если канал является буфером памяти, следующая команда видит поток в целом. Дефект неразрывно запекается в sed.

Чтобы этот подход работал, вам нужна опция g для последней команды, поэтому снова она зажимает большие файлы.

В нижней строке это: не используйте sed для обработки строк новой строки.

Ответ 3

Играя с этим дальше, Рабочее решение состоит в том, чтобы удалить "*", так как в исходном требовании нет необходимости просто удалять пробелы, а также, если требуется замена действительного символа, как показано ниже

echo -n "Hello" | od -A n -t x1 | sed 's/ /%/g'

%48%65%6c%6c%6f

Итак, я рассматриваю это как улучшение, отвечающее первоначальному Q, так как утверждение теперь делает именно то, что требуется, а не только внешне.