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

jcb*_*344 6 command-line-interface hexidecimal

我想知道是否有人知道允许我直接将十六进制值写入文件的命令行实用程序。这样当文件的十六进制转储完成时,我输入的值将被吐出。我直接写入十六进制至关重要,因为我需要写入的许多值没有任何与之关联的 unicode 或 ascii 等效字符。寻找类似的东西:

writehex f6050000 ac7e0500 02000800 01000000 newfile
hexdump newfile 
hexdump 1.02
ts.event.1
00000000: f6050000 ac7e0500 02000800 01000000 .....~..........
16 bytes read
Run Code Online (Sandbox Code Playgroud)

Den*_*son 9

这个 Bash 函数应该适合你:

writehex  ()
{
    local i
    while [ "$1" ]; do
        for ((i=0; i<${#1}; i+=2))
        do
            printf "\x${1:i:2}";
        done;
        shift;
    done
}
Run Code Online (Sandbox Code Playgroud)

替代实现:

writehex  ()
{
    local arg, i
    for arg; do
        for ((i=0; i<${#arg}; i+=2))
        do
            printf "\x${arg:i:2}"
        done
    done
}
Run Code Online (Sandbox Code Playgroud)

要测试它:

$ 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
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用xxd.

$ echo hello | xxd
0000000: 6865 6c6c 6f0a
$ echo hello | xxd | xxd -r
hello
Run Code Online (Sandbox Code Playgroud)

编辑:

此外,您可以使用该-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
Run Code Online (Sandbox Code Playgroud)

编辑2:

修改上面的函数以处理多个输入参数(由空格分隔的十六进制数字字符串)。