【问题标题】:bash ascii to hexbash ascii 到十六进制
【发布时间】:2012-10-02 13:49:41
【问题描述】:

想知道是否有人可以帮助我将 bash 中的 ascii 转换为十六进制。 示例代码:

#!/bin/bash 
STR = "hello"
#Convert to hex
HEXVAL = $STR #(in hex here?)

我希望 hexval 具有以下值: 68656C6C6F(十六进制的你好)

【问题讨论】:

标签: bash hex ascii


【解决方案1】:
$ str="hello"
$ hex=$(xxd -pu <<< "$str")
$ echo "$hex"
6C6C6568A6F

或者:

$ hex=$(hexdump -e '"%X"' <<< "$str")
$ echo "$hex"
6C6C6568A6F

小心'"%X"';它有单引号和双引号。

【讨论】:

  • xxd V1.10 27oct98,我必须使用xxd -p -u
【解决方案2】:

你有几个选择

$ printf hello | xxd
0000000: 6865 6c6c 6f                             hello

另请参阅: Ascii/Hex convert in bash

【讨论】:

    【解决方案3】:

    这是一个单一的班轮(有点复杂但工作正常):

    #!/bin/bash
    
    echo '0x'"`echo $1 | hexdump -vC |  awk 'BEGIN {IFS="\t"} {$1=""; print }' | awk '{sub(/\|.*/,"")}1'  | tr -d '\n' | tr -d ' '`" | rev | cut -c 3- | rev
    

    【讨论】:

      【解决方案4】:
      xxd -p -u <<< "$STR" | sed 's/\(..\)/0x&, /g; s/, $//;'
      

      0x68、0x65、0x6C、0x6C、0x6F、0x0A

      【讨论】:

        【解决方案5】:

        纯 BASH 将字符串转换为可打印的十六进制序列并返回

        str2hex_echo() {
            # USAGE: hex_repr=$(str2hex_echo "ABC")
            #        returns "0x410x420x43"
            local str=${1:-""}
            local fmt="0x%x"
            local chr
            local -i i
            for i in `seq 0 $((${#str}-1))`; do
                chr=${str:i:1}
                printf  "${fmt}" "'${chr}"
            done
        }
        
        hex2str_echo() {
            # USAGE: ASCII_repr=$(hex2str_echo "0x410x420x43")
            #        returns "ABC"
            echo -en "'${1:-""//0x/\\x}'"
        }
        

        解释

        ASCII->hex:从字符到其底层 ASCII 码的高效转换秘诀是 printf 中的功能,它使用非字符串格式说明符,将前导字符作为单引号或双引号作为顺序产生下一个符号的底层 ASCII 码。这种行为记录在 GNU BASH reference 中,但也与 Greg 的(也称为 GreyCat 的)wiki 页面 BashFAQ/071 中的许多其他精彩实用程序一起详细公开,专门用于 char-ASCII 转换。

        【讨论】:

        • 使用“seq”不是纯bash!但我有一个用纯 bash 编写的简化“seq”函数 :-)
        • 为什么使用seq?为什么不只是for ((i = 0; i &lt; ${#str}; ++i))
        • 为什么使用fmt 而不是将格式字符串内联?例如,printf '0x%x' "'${chr}"
        • 现在由于 unicode 字符处理将失败...它以 utf16 十六进制代码出现。
        【解决方案6】:

        仅十六进制行输出。经过测试,两个系统均已验证。

        Linux:

        $ echo 'hello' | hexdump -ve '/1 "%02x"'
        68656c6c6f0a
        
        

        苹果机:

        $ echo 'hello' | xxd -p -c 256
        68656c6c6f0a
        

        【讨论】:

          猜你喜欢
          • 2011-12-09
          • 2015-08-23
          • 1970-01-01
          • 2014-06-22
          • 2010-11-14
          • 1970-01-01
          • 2015-05-22
          • 2017-10-24
          • 2015-03-21
          相关资源
          最近更新 更多