String JQ十六进制字符串到ASCII的转换
我最终在jq中得到了一个十六进制字符串,我想在jq中转换为ASCII。在外面做这件事也需要传递多个条件,这会使事情变得过于复杂,并且会真正减慢解决方案的速度 需要明确的是:它涉及字符串转换,如:String JQ十六进制字符串到ASCII的转换,string,type-conversion,jq,String,Type Conversion,Jq,我最终在jq中得到了一个十六进制字符串,我想在jq中转换为ASCII。在外面做这件事也需要传递多个条件,这会使事情变得过于复杂,并且会真正减慢解决方案的速度 需要明确的是:它涉及字符串转换,如: "0x4162634b6c6d" -> "AbcKlm" 剥离“0x”很容易([2:]),我在bash函数中得到了等价物: function h2a () { while read s; do n=0; while [[ "$n" -lt ${#s}
"0x4162634b6c6d" -> "AbcKlm"
剥离“0x”很容易([2:]),我在bash函数中得到了等价物:
function h2a ()
{
while read s; do
n=0;
while [[ "$n" -lt ${#s} ]]; do
h="${s:$n:2}";
printf "\x$h";
n="$(($n+2))";
done;
done
}
但我真的很想在原生jq中这样做。我找到了,但无法转换
谢谢你的帮助
编辑:正在取得进展,已找到
现在,我如何转换和迭代
$ cat q6.jq
{ "b":
[(
{ "a": (split("")) }
| .a[]
| gsub ("a"; "10"; "i") | gsub ("b"; "11"; "i") | gsub ("c"; "12"; "i") | gsub ("d"; "13"; "i") | gsub ("e"; "14"; "i") | gsub ("f"; "15"; "i")
)
]
}
| { "a": [ .b as $m | range(0; $m | length; 2) | { "q" : [ ($m[.]|tonumber), ($m[(. + 1)]|tonumber) ] } ] } |
[ (.a[].q) as $b | (($b[0]) * 16) as $d | ($b[1]) as $e | ($d+$e) ] | implode
$ echo '"4162634b6c6d"' | jq -f q6.jq
"AbcKlm"
$
是的,我知道,它很难看,是bash函数的两倍大,而且可以工作。如果你能改进,请告诉我们
是的,我知道,它很难看,是bash函数的两倍大,而且可以工作。如果您可以改进:请向我们展示。您可以使用以下功能:
def decode_hex:
("0123456789abcdef"|split("")|with_entries({key:.value, value:.key})) as $hex_map |
def decode_nybble: $hex_map[ascii_downcase];
def decode_byte: (.[0:1]|decode_nybble * 16) + (.[1:2]|decode_nybble);
def pairs: range(0;length;2) as $i | .[$i:$i+2];
[pairs|decode_byte] | implode;
然后要使用它,请去掉所有非十六进制字符并传入字符串
.[2:] | decode_hex
有趣的旁注是,字符串的处理方式与数组非常不同,这让我感到惊讶。您不能直接索引到它们中,也不能对它们执行其他类似于数组的操作。通过查看上面定义的
$hex\u map
和decode\u byte
可以看出它有多尴尬。您可以使用如下函数:
def decode_hex:
("0123456789abcdef"|split("")|with_entries({key:.value, value:.key})) as $hex_map |
def decode_nybble: $hex_map[ascii_downcase];
def decode_byte: (.[0:1]|decode_nybble * 16) + (.[1:2]|decode_nybble);
def pairs: range(0;length;2) as $i | .[$i:$i+2];
[pairs|decode_byte] | implode;
然后要使用它,请去掉所有非十六进制字符并传入字符串
.[2:] | decode_hex
有趣的旁注是,字符串的处理方式与数组非常不同,这让我感到惊讶。您不能直接索引到它们中,也不能对它们执行其他类似于数组的操作。通过查看上面定义的
$hex\u map
和decode\u byte
可以看出这有多尴尬。如果需要有效的解决方案,那么piggy就放弃@JeffMercado的答案:
def decode_hex:
def decode: if . < 58 then .-48 elif . < 91 then .-55 else .-87 end;
def decode_byte: map(decode) | (.[0] * 16) + .[1];
def pairs: explode | range(0;length;2) as $i | [.[$i], .[$i+1]];
[pairs|decode_byte] | implode;
def解码\u十六进制:
def解码:如果58那么-48 elif.<91那么-55或者-87结束;
def decode_字节:映射(decode)|([0]*16)+[1];
def对:将|范围(0;长度;2)分解为$i |[[i],[i+1];
[成对|解码|字节]|内爆;
如果需要有效的解决方案,那么piggy会放弃@JeffMercado的答案:
def decode_hex:
def decode: if . < 58 then .-48 elif . < 91 then .-55 else .-87 end;
def decode_byte: map(decode) | (.[0] * 16) + .[1];
def pairs: explode | range(0;length;2) as $i | [.[$i], .[$i+1]];
[pairs|decode_byte] | implode;
def解码\u十六进制:
def解码:如果58那么-48 elif.<91那么-55或者-87结束;
def decode_字节:映射(decode)|([0]*16)+[1];
def对:将|范围(0;长度;2)分解为$i |[[i],[i+1];
[成对|解码|字节]|内爆;
在decode\u hex
之外执行(“0123456789abcdef”|拆分(“”)|和_项({key:.value,value:.key}))作为$hex\u map
,会使此操作更为快捷,但您可能会面临重新定义$hex\u map
的风险。从技术上讲,所有功能也可以。这将使它保持在一个很好的包中。在解码hex
之外执行(“0123456789abcdef”|拆分(“”)|并将| u项({key:.value,value:.key})作为$hex_map
使此操作更为安全,但您可能会面临被重新定义的风险。从技术上讲,所有功能也可以。这使它保持在一个很好的包。