通过命令行将十六进制值写入文件(而不是 ascii 值)

通过命令行将十六进制值写入文件(而不是 ascii 值)

我想知道是否有人知道一个命令行实用程序,它允许我直接将十六进制值写入文件。这样,当文件的十六进制转储完成时,我输入的值就会被吐出。我必须直接写入十六进制,因为我需要写入的许多值都没有与之相关的任何 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 的调用和一个轻量级正则表达式。您的里程可能会有所不同,但我发现它要快得多。

相关内容