我有一个二进制文件,我想将其打包为JSON数组,如下所示:
{
"content": [0, 23, 45,...]
}
现在,我使用十六进制转储将文件转储到一个单独的文件中(以打印为带逗号的无符号U8),并手动将这些内容粘贴到数组中:
hexdump -ve '1/1 "%u," foo.bin > foo_arr
为了寻找一种更好的方法来实现这一点,最好是通过命令行(jq,标准的*nix工具),JavaScript也可以工作,但我宁愿避免它。
发布于 2021-10-28 13:35:06
这里有一个选择:
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
]
}
发布于 2021-10-28 15:40:48
使用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。
发布于 2021-10-28 14:30:48
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
方法转换的是单字节计数,因此在这方面结果可能会有所不同。
https://stackoverflow.com/questions/69761040
复制相似问题