将二进制文件内容转储到 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。