Запись шестнадцатеричных значений в файл (не как значения ascii) через командную строку
Мне было интересно, знает ли кто-нибудь об утилите командной строки, которая позволит мне напрямую записывать шестнадцатеричные значения в файл. так, что, когда шестнадцатеричная запись файла сделана, введенные мной значения будут выплеваны. Крайне важно, чтобы я записывал непосредственно в hex, так как многие значения, которые мне нужно записать, не имеют связанных с ними символов Unicode или ASCII. Ищу что-то вроде:
writehex f6050000 ac7e0500 02000800 01000000 newfile
hexdump newfile
hexdump 1.02
ts.event.1
00000000: f6050000 ac7e0500 02000800 01000000 .....~..........
16 bytes read
4 ответа
Эта функция Bash должна работать для вас:
writehex ()
{
local i
while [ "$1" ]; do
for ((i=0; i<${#1}; i+=2))
do
printf "\x${1:i:2}";
done;
shift;
done
}
Альтернативная реализация:
writehex ()
{
local arg, i
for arg; do
for ((i=0; i<${#arg}; i+=2))
do
printf "\x${arg:i:2}"
done
done
}
Чтобы проверить это:
$ writehex abc00001ff | hexdump -C
00000000 ab c0 00 01 ff |.....|
00000005
$ writehex f6050000 ac7e0500 02000800 01000000 | hexdump -C
00000000 f6 05 00 00 ac 7e 05 00 02 00 08 00 01 00 00 00 |.....~..........|
00000010
Другой вариант будет использовать xxd
,
$ echo hello | xxd
0000000: 6865 6c6c 6f0a
$ echo hello | xxd | xxd -r
hello
Редактировать:
Кроме того, вы можете использовать -p
возможность принимать несколько произвольных входных данных:
$ echo 'f6050000 ac7e0500 02000800 01000000' | xxd -r -p | hexdump -C
00000000 f6 05 00 00 ac 7e 05 00 02 00 08 00 01 00 00 00 |.....~..........|
00000010
Изменить 2:
Измененная выше функция для обработки нескольких входных аргументов (строки шестнадцатеричных цифр, разделенных пробелами).
С perl
:
perl -ne '@a=split;for(@a){print chr(hex($_))}' inputfile > outputfile
Где содержание inputfile
отформатирован:
42 43 44
outputfile
будет содержать BCD
, Вы можете подготовить свой входной файл в vi
вот так:
:%s/ //g
:%s/\(.\{2\}\)/\1 /g
Это удалит все пробелы, а затем вставит пробел между каждым символом.
Пример, который вы дали, используя это perl
линия:
$ cat inputfile
f6 05 00 00 ac 7e 05 00 02 00 08 00 01 00 00 00
$ hexdump outputfile
0000000 f6 05 00 00 ac 7e 05 00 02 00 08 00 01 00 00 00
0000010
А как насчет шестнадцатеричного редактора, например hexedit ou hexer? Вы можете напрямую редактировать файл и вводить значения в шестнадцатеричном формате с ними.
Просто был такой же вызов и нашел это решение. Я попытался использовать решение от Денниса Уильямсона, но оно было очень медленным, когда оно было реализовано в массовой операции (пришлось преобразовывать ~60 тыс. Больших двоичных объектов в файлы). Я придумал повторную реализацию writehex
которым я хотел поделиться здесь:
writehex ()
{
HEX=$(echo $1 | sed -re 's:([0-9A-F]{2}):\\x\1:g')
echo -e $HEX
}
Когда дело доходит до производительности, то ее преимуществом является то, что она просто использует один вызов sed и облегченное регулярное выражение. Ваш пробег может варьироваться, но я обнаружил, что он намного быстрее.