2017-01-10 12 views
2

Я хотел бы написать символы не-ASCII (0xfe, 0xed и т. Д.) На стандартный ввод программы.bash - введите символы в шестнадцатеричном виде в стандартный ввод

Есть много подобных вопросов к этому, но я не нашел ответа, потому что:

  • Я хочу написать однобайтовые символы, а не символы Юникода
  • Я могу» т труб выход echo или что-то

На OS X¹ вы можете проверить с:

nm - - 

Я хотел бы написать магические байты объектных файлов (например, 0xfeedface) до nm с использованием стандартного ввода, чтобы я мог видеть, как он себя ведет, и я могу его перекодировать.

Если я использую трубку, то второй аргумент -, что означает стандартного ввода, никогда не будет найдено ни одного байта, так как все стандартный ввод будет идти к первому. При использовании терминала вместо трубы я могу ввести Ctrl + D, чтобы первый получил «закрытый», а второй начал читать.

Я пробовал с Ctrl + Shift + U и Unicode Hex Input OS X, но он не работает - я не могу записать с ним нужные символы.

Я также пробовал с буфером обмена с pbcopy, но он не может читать/вставлять символы, отличные от ASCII или не-Юникода.

Как я могу достичь своей цели?

Не стесняйтесь, так как это был трудный вопрос для выражения.

¹ nm на Linux не обрабатывает стандартного ввода.

+1

Это зависит от эмулятора терминала. Невозможно набрать все символы на клавиатуре. – Barmar

ответ

2

Попробуйте Util как xxd:

# echo hex 52 to pipe, convert it to binary, which goes to stdout 
echo 52 | xxd -r ; echo 
R 

Или для более специализированной Util попробовать ascii2binary (вход по умолчанию является десятичным):

# echo dec 52 to pipe, convert it to binary, which goes to stdout 
echo 52 | ascii2binary ; echo 
4 

# echo base11 52 to pipe, convert it to binary, which goes to stdout 
echo 52 | ascii2binary -b 11 ; echo 
9 

Или сбросить серию шестнадцатеричных символов, показывая, что hexdump видит:

echo 7 ef 52 ed 19 | ascii2binary -b h | \ 
    hexdump -v -e '/1 "%_ad# "' -e '/1 " _%_u\_\n"' 
0# _bel_ 
1# _ef_ 
2# _R_ 
3# _ed_ 
4# _em_ 

См. man xxd ascii2binary для различных трюков, которые могут использовать эти утилиты.

+0

К сожалению, я не могу передать выходные данные этих инструментов моей программе, потому что мне нужно «закрыть» stdin, а затем снова открыть его. Piping не работает, поэтому мне интересно, как вводить или вставлять не-ascii символы не-Unicode в стандартный ввод без протокола – Bilow

+0

@Bilow, если у вас есть 'bash', попробуйте использовать код с [заменой процесса] (https://www.gnu.org/software/bash/manual/html_node/Process-Substitution.html) следующим образом: 'nm <(echo ef ed | ascii2binary -bh) -', это создает временный файл из файлового дескриптора (содержащий вывод кода в скобках), который поэтому должен освобождать второй' 'получать * stdin *. См. Также [OS X/Linux: pipe в два процесса?] (Http://stackoverflow.com/questions/10218103/os-x-linux-pipe-into-two-processes) – agc

+0

Подстановки процесса - хорошая идея. Но я бы хотел проверить этот конкретный случай, когда оба входа являются stdin, на нм и, более конкретно, на программы, которые были написаны студентами. Может быть, я не могу добиться того, что хочу? – Bilow

 Смежные вопросы

  • Нет связанных вопросов^_^