代码之家  ›  专栏  ›  技术社区  ›  Krystian Cybulski

linux shell脚本:十六进制字符串到字节

  •  54
  • Krystian Cybulski  · 技术社区  · 16 年前

    5a .

    这是ASCII字母的十六进制表示形式 Z .

    我需要知道一个Linuxshell命令,它将接受一个十六进制字符串并输出该字符串所代表的ASCII字符。

    因此,如果我这样做:

    echo 5a | command_im_looking_for
    

    我要看一封单独的信 Z

    Z
    
    12 回复  |  直到 7 年前
        1
  •  105
  •   josch    14 年前

    我以前用xxd来做这个

    echo -n 5a | xxd -r -p
    

    echo -n 5a | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf
    

    大多数情况下,我只想转换几个字节,这样的任务就可以了。与ghostdog74相比,此解决方案的优势在于,它可以自动转换任意长度的十六进制字符串。使用xargs是因为printf不从标准输入读取。

        2
  •  62
  •   bdonlan    16 年前
    echo -n 5a | perl -pe 's/([0-9a-f]{2})/chr hex $1/gie'
    

    echo 5a | perl -ne 's/([0-9a-f]{2})/print chr hex $1/gie'
    

    zsh bash 以本地方式支持此功能 echo :

    echo -e '\x5a'
    
        3
  •  15
  •   Fa11enAngel    13 年前

    你可以只通过echo而不使用其他东西。不要忘记添加“-n”,否则您将自动获得换行符:

    echo -n -e "\x5a"
    
        4
  •  10
  •   user3132194    11 年前

    击打一个班轮

    echo -n "5a" | while read -N2 code; do printf "\x$code"; done
    
        5
  •  4
  •   ghostdog74    16 年前

    根据“5a”的来源,您可以将\x附加到它并传递到printf

    $ a=5a
    $ a="\x${a}"
    $ printf "$a"
    Z
    
        6
  •  4
  •   Jack O'Connor    10 年前

    解码十六进制(带 strip ,这样就可以在stdin上换行):

    $ echo 666f6f0a | python3 -c "import sys, binascii; sys.stdout.buffer.write(binascii.unhexlify(input().strip()))"
    foo
    

    编码十六进制:

    $ echo foo | python3 -c "import sys, binascii; print(binascii.hexlify(sys.stdin.buffer.read()).decode())"
    666f6f0a
    
        7
  •  2
  •   unutbu    16 年前
    echo 5a | python -c "import sys; print chr(int(sys.stdin.read(),base=16))"
    
        8
  •  2
  •   Vouze    11 年前

    下面是一个纯bash脚本(因为printf是bash内置的):

    #warning : spaces do matter
    die(){ echo "$@" >&2;exit 1;}
    
    p=48656c6c6f0a
    
    test $((${#p} & 1)) == 0 || die "length is odd"
    p2=''; for ((i=0; i<${#p}; i+=2));do p2=$p2\\x${p:$i:2};done
    printf "$p2"
    

    如果bash已经在运行,那么它应该比启动新进程的任何其他解决方案都要快。

        9
  •  2
  •   Roger Willcocks    11 年前

    dc可以在数字基之间转换:

    $ echo 5a | (echo 16i; tr 'a-z' 'A-Z'; echo P) | dc
    Z$
    
        10
  •  0
  •   Zombo tliff    11 年前

    GNU awk 4.1

    awk -niord '$0=chr("0x"RT)' RS=.. ORS=
    

    $ echo 595a | awk -niord '$0=chr("0x"RT)' RS=.. ORS= | od -tx1c
    0000000  59  5a  00
              Y   Z  \0
    

    而是使用printf

    $ printf 595a | awk -niord '$0=chr("0x"RT)' RS=.. ORS= | od -tx1c
    0000000  59  5a
              Y   Z
    

    $ printf a1 | awk -niord '$0=chr("0x"RT)' RS=.. ORS= | od -tx1
    0000000 c2 a1
    

    如果您正在处理ASCII以外的字符,您将 Base64编码结果字符串,可以使用禁用UTF-8 -b

    echo 5a | sha256sum | awk -bniord 'RT~/\w/,$0=chr("0x"RT)' RS=.. ORS=
    
        11
  •  0
  •   tehmoon    8 年前

    与我的回答类似: Linux shell scripting: hex number to binary string

    5a ):

    echo -n 616263 | cryptocli dd -decoders hex
    

    将产生以下结果:

    abcd
    
        12
  •  0
  •   kenorb    8 年前

    根据 @Randal comment ,你可以使用 perl

    $ printf 5a5a5a5a | perl -lne 'print pack "H*", $_'
    ZZZZ
    

    反过来说:

    $ printf ZZZZ | perl -lne 'print unpack "H*", $_'
    5a5a5a5a
    

    文件的另一个示例:

    $ printf 5a5a5a5a | perl -lne 'print pack "H*", $_' > file.bin
    $ perl -lne 'print unpack "H*", $_' < file.bin
    5a5a5a5a
    
        13
  •  0
  •   Yingchun    6 年前

    sudo apt install ascii
    

    然后:

    ascii 0x5a
    

    将输出:

    ASCII 5/10 is decimal 090, hex 5a, octal 132, bits 01011010: prints as `Z'
    Official name: Majuscule Z
    Other names: Capital Z, Uppercase Z
    
        14
  •  0
  •   Mahdi Perfect    5 年前

    对于较大的输入,可以使用此命令(python脚本):

    echo 58595a | python -c "import sys; import binascii; print(binascii.unhexlify(sys.stdin.read().strip()).decode())"
    

    结果将是:

    XYZ
    

    为了更简单,请定义一个别名:

    alias hexdecoder='python -c "import sys; import binascii; print(binascii.unhexlify(sys.stdin.read().strip()).decode())"'
    
    echo 58595a | hexdecoder