将二进制文件内容转储到 JSON 数组中
Dump binary file contents in a JSON array
我有一个二进制文件,我想将其打包为 JSON 数组,如下所示:
{
"content": [0, 23, 45,...]
}
现在我使用 hexdump 将文件转储到一个单独的文件中(打印为带逗号的未签名 u8)并手动将这些内容粘贴到数组中:
hexdump -ve '1/1 "%u," foo.bin > foo_arr
寻找更好的方法来实现这一点,最好是通过命令行(jq,标准 *nix 工具),JavaScript 也可以,但我宁愿避免它。
这是一种选择:
hexdump -ve '1/1 "%u\n"' foo.bin | jq -s '{content: .}'
在这里,我使用 jq
的 -s
标志(“slurp”)将标准输入的所有行作为单个数组读入,然后简单地使用该数组作为 content
.
例如:
$ python -c 'open("foo.bin", "wb").write(b"abc")'
$ hexdump -ve '1/1 "%u\n"' foo.bin | jq -s '{content: .}'
{
"content": [
97,
98,
99
]
}
jq
可以使用 -R
(或 --raw-input
)读取原始输入并使用 explode
builtin:
jq -Rs '{content: explode}' foo.bin
如果二进制文件不是太大,您也可以使用--arg
将其读入变量,然后在其上应用explode
。
jq -n --arg bin "$(cat foo.bin)" '{content: $bin | explode}'
注意:jq
对 Unicode 代码点进行操作,而您当前的 hexdump
方法转换单字节计数,因此结果可能与此不同。
使用perl
:
$ printf "\x00\x17\x2d" > foo.bin
$ perl -0777 -nE '@bytes = map { ord } split //, $_;
$" = ","; # Delimiter when inserting an array into a string
say qq/{"content":[@bytes]}/' foo.bin
{"content":[0,23,45]}
一次读取整个文件 (-O777 -n
) 并将其拆分为一个字节数组,然后用这些字节值输出 JSON。
我有一个二进制文件,我想将其打包为 JSON 数组,如下所示:
{
"content": [0, 23, 45,...]
}
现在我使用 hexdump 将文件转储到一个单独的文件中(打印为带逗号的未签名 u8)并手动将这些内容粘贴到数组中:
hexdump -ve '1/1 "%u," foo.bin > foo_arr
寻找更好的方法来实现这一点,最好是通过命令行(jq,标准 *nix 工具),JavaScript 也可以,但我宁愿避免它。
这是一种选择:
hexdump -ve '1/1 "%u\n"' foo.bin | jq -s '{content: .}'
在这里,我使用 jq
的 -s
标志(“slurp”)将标准输入的所有行作为单个数组读入,然后简单地使用该数组作为 content
.
例如:
$ python -c 'open("foo.bin", "wb").write(b"abc")'
$ hexdump -ve '1/1 "%u\n"' foo.bin | jq -s '{content: .}'
{
"content": [
97,
98,
99
]
}
jq
可以使用 -R
(或 --raw-input
)读取原始输入并使用 explode
builtin:
jq -Rs '{content: explode}' foo.bin
如果二进制文件不是太大,您也可以使用--arg
将其读入变量,然后在其上应用explode
。
jq -n --arg bin "$(cat foo.bin)" '{content: $bin | explode}'
注意:jq
对 Unicode 代码点进行操作,而您当前的 hexdump
方法转换单字节计数,因此结果可能与此不同。
使用perl
:
$ printf "\x00\x17\x2d" > foo.bin
$ perl -0777 -nE '@bytes = map { ord } split //, $_;
$" = ","; # Delimiter when inserting an array into a string
say qq/{"content":[@bytes]}/' foo.bin
{"content":[0,23,45]}
一次读取整个文件 (-O777 -n
) 并将其拆分为一个字节数组,然后用这些字节值输出 JSON。