Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String JQ十六进制字符串到ASCII的转换_String_Type Conversion_Jq - Fatal编程技术网

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

我最终在jq中得到了一个十六进制字符串,我想在jq中转换为ASCII。在外面做这件事也需要传递多个条件,这会使事情变得过于复杂,并且会真正减慢解决方案的速度

需要明确的是:它涉及字符串转换,如:

"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
使此操作更为安全,但您可能会面临被重新定义的风险。从技术上讲,所有功能也可以。这使它保持在一个很好的包。