首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用jq从JSON中提取未编码的二进制数据

使用jq从JSON中提取未编码的二进制数据
EN

Stack Overflow用户
提问于 2018-01-13 12:54:34
回答 2查看 1.3K关注 0票数 2

假设我有一个0xb7字节编码为UTF代码点的JSON:

代码语言:javascript
运行
复制
{"key":"_\u00b7_"}

如果我用jq提取"key“的值,它将保持这个字节的utf8编码,即"c2 b7":

代码语言:javascript
运行
复制
$ echo '{"key":"_\u00b7_"}' | ./jq '.key' -r | xxd
0000000: 5fc2 b75f 0a                             _.._.

有jq命令从这个JSON?中提取解码的"5f b7 5f“字节序列吗?

我可以通过一些额外的工具来解决这个问题,比如iconv,但是它有点难看:

代码语言:javascript
运行
复制
$ echo '{"key":"_\u00b7_"}' | ./jq '.key' -r \
      | iconv -f utf8 -t utf32le \
      | xxd -ps | sed -e 's/000000//g' | xxd -ps -r \
      | xxd
0000000: 5fb7 5f0a                                _._.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-13 17:46:42

代码语言:javascript
运行
复制
def hx:
  def hex: [if . < 10 then 48 + . else  55 + . end] | implode ;
  tonumber | "\(./16 | floor | hex)\(. % 16 | hex)";

{"key":"_\u00b7_"} | .key | explode | map(hx)

生产:

代码语言:javascript
运行
复制
["5F","B7","5F"]

“原始拜特斯”(注意事项)

因为jq只支持UTF-8字符串,所以您必须使用一些外部工具来获得“原始字节”。也许这更接近你想要的:

代码语言:javascript
运行
复制
jq -nrj '{"key":"_\u00b7_"} | .key' | iconv -f utf-8 -t ISO8859-1

这就产生了三个字节。

这里有一个无图标的解决方案:

代码语言:javascript
运行
复制
jq -nrj '{"key":"_\u00b7_"} | .key' | php -r 'print utf8_decode(readline());'
票数 2
EN

Stack Overflow用户

发布于 2018-01-14 14:10:02

交替

jq之外寻址字符编码场景

虽然您不想要额外的工具,但iconvhexdump确实很容易获得--例如,当我需要完全了解管道的某些部分时,我经常依赖于iconv,而当我想控制这些部分的表示形式的格式时,使用hexdump

因此,另一种选择是:

代码语言:javascript
运行
复制
jq -njr '{"key":"_\u00b7_"} | .key' | iconv -f utf8 -t UTF-32LE | hexdump -ve '1/1 "%.X"'

结果:

5FB75F

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48240055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档