将二进制文件内容转储到 JSON 数组中

3
我有一个二进制文件,希望将其打包为如下的JSON数组:
{
  "content": [0, 23, 45,...]
}

目前我使用hexdump将文件转储到单独的文件中(以带逗号的无符号u8形式打印),然后手动将这些内容粘贴到数组中:

hexdump -ve '1/1 "%u," foo.bin > foo_arr

寻找更好的方法来实现这一点,最好是通过命令行(使用jq、标准*nix工具),JavaScript也可以,但我宁愿避免使用它。
3个回答

4

以下是一个选项:

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
  ]
}

1

使用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。


perl -0777pe'@b = join ",", unpack "C*", $; $ = qq/{"content":[@b]}/'(避免了前向不兼容的-E和不必要的$"更改。) - ikegami

0

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 方法将单个字节计数转换为结果可能会因此而有所不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接