![通过命令行将十六进制值写入文件(而不是 ascii 值)](https://linux22.com/image/528089/%E9%80%9A%E8%BF%87%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B0%86%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6%E5%80%BC%E5%86%99%E5%85%A5%E6%96%87%E4%BB%B6%EF%BC%88%E8%80%8C%E4%B8%8D%E6%98%AF%20ascii%20%E5%80%BC%EF%BC%89.png)
我想知道是否有人知道一个命令行实用程序,它允许我直接将十六进制值写入文件。这样,当文件的十六进制转储完成时,我输入的值就会被吐出。我必须直接写入十六进制,因为我需要写入的许多值都没有与之相关的任何 unicode 或 ascii 等效字符。寻找类似的东西:
writehex f6050000 ac7e0500 02000800 01000000 newfile
hexdump newfile
hexdump 1.02
ts.event.1
00000000: f6050000 ac7e0500 02000800 01000000 .....~..........
16 bytes read
答案1
这个 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:
修改上述函数来处理多个输入参数(由空格分隔的十六进制数字字符串)。
答案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
答案3
那么十六进制编辑器呢,例如 hexedit 或 hexer?您可以直接用它们编辑文件并输入十六进制值。
答案4
刚刚遇到了同样的挑战,并找到了这个解决方案。我尝试采用 Dennis Williamson 的解决方案,但在大规模操作中实施时速度非常慢(必须将 ~60k sqlite blob 转换为文件)。我想出了一个重新实现,writehex
我想在这里分享一下:
writehex ()
{
HEX=$(echo $1 | sed -re 's:([0-9A-F]{2}):\\x\1:g')
echo -e $HEX
}
说到性能,它的优点是它只使用一次对 sed 的调用和一个轻量级正则表达式。您的里程可能会有所不同,但我发现它要快得多。