Tengo un archivo binario que me gustaría empaquetar como una matriz JSON así:
{ "content": [0, 23, 45,...] }En este momento, descargo el archivo usando hexdump en un archivo separado (para imprimir como u8 sin firmar con comas) y pego manualmente esos contenidos en la matriz:
hexdump -ve '1/1 "%u," foo.bin > foo_arrBuscando una mejor manera de lograr esto, preferiblemente a través de la línea de comando (jq, herramientas estándar * nix), JavaScript también podría funcionar, pero prefiero evitarlo.
Aquí hay una opción:
hexdump -ve '1/1 "%u\n"' foo.bin | jq -s '{content: .}' Aquí, uso jq 's -s flag ("slurp") para leer todas las líneas de stdin como una sola matriz, luego simplemente uso esa matriz como el valor de content .
Por ejemplo:
$ python -c 'open("foo.bin", "wb").write(b"abc")' $ hexdump -ve '1/1 "%u\n"' foo.bin | jq -s '{content: .}' { "content": [ 97, 98, 99 ] }Usando 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]} Lee todo el archivo a la vez ( -O777 -n ) y lo divide en una matriz de bytes, y luego genera el JSON con esos valores de bytes.
jq puede leer la entrada sin procesar usando -R (o --raw-input ) y convertirla a sus números de punto de código usando la función de explode incorporada :
jq -Rs '{content: explode}' foo.bin Si el archivo binario no es demasiado grande, también puede leerlo en una variable usando --arg y luego aplicar explode en eso.
jq -n --arg bin "$(cat foo.bin)" '{content: $bin | explode}' Nota: jq opera en puntos de código Unicode, mientras que su enfoque actual hexdump traduce recuentos de bytes individuales, por lo que los resultados pueden diferir a este respecto.