【问题标题】:Ascii/Hex convert in bashAscii/Hex 在 bash 中转换
【发布时间】:2011-08-09 03:31:29
【问题描述】:

我现在就是这样做的:

[root@~]# echo Aa|hexdump -v
0000000 6141 000a                              
0000003
[root@~]# echo -e "\x41\x41\x41\x41"
AAAA

但它的行为并不完全符合我的意愿,

Aa的十六进制形式应该是4161,但是输出是6141 000a,好像没有意义。

当对 ascii 执行十六进制时,是否有另一个实用程序,这样我就不需要前缀 \x 了?

【问题讨论】:

    标签: bash ascii hex


    【解决方案1】:

    原因是hexdump 默认打印出 16 位整数,而不是字节。如果您的系统有它们,hd(或hexdump -C)或xxd 将提供不那么令人惊讶的输出 - 如果没有,od -t x1 是获取逐字节十六进制输出的 POSIX 标准方法。您可以使用od -t x1c 来显示字节十六进制值和对应的字母。

    如果您有xxd(随vim 提供),您可以使用xxd -r 从十六进制转换回来(与xxd 产生的相同格式)。如果您只有普通的十六进制(只有“4161”,由xxd -p 生成),您可以使用xxd -r -p 转换回来。

    【讨论】:

    • xxd -p -r AAA,这个不行,可以直接从命令行取参数吗?
    • 不...并且'r'从十六进制转换回来,你想要'echo 4161 | xxd -r -p'或'echo Aa | xxd -p'
    【解决方案2】:

    第一部分,试试

    echo Aa | od -t x1
    

    逐字节打印

    $ echo Aa | od -t x1
    0000000 41 61 0a
    0000003
    

    0a 是 echo 产生的隐式换行符。

    请改用echo -nprintf

    $ printf Aa | od -t x1
    0000000 41 61
    0000002
    

    【讨论】:

    • 如何将十六进制转换回ASCII?
    • 示例:echo -e "\x68"
    【解决方案3】:
    $> printf "%x%x\n" "'A" "'a"
    4161
    

    【讨论】:

    • @gdb:请参阅printf,其中说:“如果前导字符是单引号或双引号,则该值应是后面字符的基础代码集中的数值单引号或双引号。”
    • 这里的 c 风格 printf 解决方案应该是公认的答案。它是最便携和最简单的,并且符合 POSIX 合规性,无需使用可能可用或不可用的外部工具。
    【解决方案4】:

    对于单行解决方案:

    echo "Hello World" | xxd -ps -c 200 | tr -d '\n'
    

    它将打印:

    48656c6c6f20576f726c640a
    

    或用于文件:

    cat /path/to/file | xxd -ps -c 200 | tr -d '\n'
    

    反向操作:

    echo '48656c6c6f20576f726c640a' | xxd -ps -r
    

    它将打印:

    Hello World
    

    【讨论】:

      【解决方案5】:

      使用 bash :

      a=abcdefghij    
      for ((i=0;i<${#a};i++));do printf %02X \'${a:$i:1};done
      

      6162636465666768696A

      【讨论】:

      • 某些字符(如空格、制表符、\r、\n)的错误输出所有这些字符都将显示为 \x00
      【解决方案6】:

      我不知道它看起来有多疯狂,但它确实做得很好

      ascii2hex(){ a="$@";s=0000000;printf "$a" | hexdump | grep "^$s"| sed s/' '//g| sed s/^$s//;}
      

      当我试图在 HEX 中查看我的名字时创建了这个;) 使用你怎么使用它:)

      【讨论】:

        【解决方案7】:
        Text2Conv="Aa"
        for letter in $(echo "$Text2Conv" | sed "s/\(.\)/'\1 /g");do printf '%x' "$letter";done
        

        4161

        诀窍是使用 sed 将 Text2Conv 解析为格式,然后我们可以使用 for 分离 anf 循环。

        【讨论】:

          【解决方案8】:

          我用:

          > echo Aa | tr -d '\n' | xxd -p
          4161
          
          > echo 414161 | tr -d '\n' | xxd -r -p
          AAa
          

          tr -d '\n' 将修剪您输入中任何可能的换行符

          【讨论】:

            【解决方案9】:

            这是我编写的一个小脚本,用于将 ascii 转换为十六进制。希望对你有帮助:

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

            【讨论】:

              【解决方案10】:

              SteinAir 上面的回答对我很有帮助——谢谢!下面是它启发的一种方式,将十六进制字符串转换为 ascii:

              for h in $(echo "4161" | sed "s/\(..\)/\1 /g"); do printf `echo "\x$h"`;done
              Aa
              

              【讨论】:

                【解决方案11】:
                echo -n Aa | hexdump -e '/1 "%02x"'; echo
                

                【讨论】:

                  【解决方案12】:

                  根据http://mylinuxbook.com/hexdump/,您可能会使用 hexdump 格式参数

                  echo Aa | hexdump -C -e '/1 "%02X"'
                  

                  将返回4161

                  要在末尾添加额外的换行符,请附加另一个格式化程序。

                  但是:上面给出的格式将为重复字符提供乘数输出

                  $ printf "Hello" | hexdump -e '/1 "%02X"' 
                  48656C*
                  6F
                  

                  而不是

                  48656c6c6f
                  

                  【讨论】:

                    【解决方案13】:
                    jcomeau@aspire:~$ echo -n The quick brown fox jumps over the lazy dog | python -c "print raw_input().encode('hex'),"
                    54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f67
                    jcomeau@aspire:~$ echo -n The quick brown fox jumps over the lazy dog | python -c "print raw_input().encode('hex')," | python -c "print raw_input().decode('hex'),"
                    The quick brown fox jumps over the lazy dog
                    

                    Python3 也可以,但不同的是,我是一只懒狗。

                    【讨论】:

                    • python != bash
                    • sedhexdumpprintfawkxxd 都不是。
                    • 它比其他一些解决方案更短,并且可以说更具可读性。它从 Bash 命令行转换两种方式。我不明白你的意思。
                    • 重点是,他要求 bash 解决方案。意思是,根据他的上下文,bashisms 或 bash 内置插件。你没有在 python 解决方案中提供这个。
                    【解决方案14】:

                    终于找对了

                    echo "Hello, world!" | tr -d '\n' | xxd -ps -c 200
                    

                    【讨论】:

                    • echo -n "Hello, world!" | xxd -ps -c 200 也可以使用
                    • 我通常使用xxd -ps -c 200 &lt;&lt;&lt; "Hello, world!"
                    【解决方案15】:

                    echo 在末尾附加一个回车。

                    使用

                    echo -e
                    

                    去除多余的0x0A

                    此外,默认情况下,hexdump 不能按字节工作。这就是为什么它以奇怪的字节顺序向您显示字节以及为什么它向您显示额外的 0x00。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2014-08-25
                      • 1970-01-01
                      • 2012-11-02
                      • 2015-11-06
                      • 2014-09-05
                      • 2019-09-13
                      • 2018-08-30
                      • 2015-12-19
                      相关资源
                      最近更新 更多