Ascii/Hex转换为bash

gdb*_*gdb 40 bash hex ascii

我现在这样做:

[root@~]# echo Aa|hexdump -v
0000000 6141 000a                              
0000003
[root@~]# echo -e "\x41\x41\x41\x41"
AAAA
Run Code Online (Sandbox Code Playgroud)

但它并不像我想的那样完全表现,

十六进制形式Aa应该是4161,但输出是6141 000a,这似乎没有意义.

当执行十六进制到ascii时,是否有另一个实用程序,所以我不需要前缀\x

Ran*_*832 55

原因是因为hexdump默认情况下打印出16位整数,而不是字节.如果您的系统具有它们,hd(或hexdump -C)或xxd将提供不太令人惊讶的输出 - 如果不是,od -t x1则是POSIX标准的方式来获得逐字节十六进制输出.您可以使用它od -t x1c来显示字节十六进制值和相应的字母.

如果你有xxd(随vim一起提供),你可以使用xxd -r从十六进制转换回来(从相同的格式xxd生成).如果你只有普通的十六进制(只是'4161',由它产生xxd -p)你可以xxd -r -p用来转换回来.

  • 不......而且'r'从十六进制转换回来,你需要像'echo 4161 |那样的东西 xxd -r -p`'或'`echo Aa | xxd -p`' (9认同)

Mik*_*kel 19

第一部分,试试吧

echo Aa | od -t x1
Run Code Online (Sandbox Code Playgroud)

它逐字节打印

$ echo Aa | od -t x1
0000000 41 61 0a
0000003
Run Code Online (Sandbox Code Playgroud)

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

使用echo -nprintf代替.

$ printf Aa | od -t x1
0000000 41 61
0000002
Run Code Online (Sandbox Code Playgroud)

  • 如何将十六进制转换回ascii? (2认同)

bas*_*ist 16

$> printf "%x%x\n" "'A" "'a"
4161
Run Code Online (Sandbox Code Playgroud)

  • @gdb:请参阅[printf](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html)其中说:“如果前导字符是单引号或双引号,则该值应是单引号或双引号后面的字符的基础代码集中的数值。" (2认同)
  • 这里的 c 风格 `printf` 解决方案应该是公认的答案。它是最可移植和最简单的,并且符合 POSIX 合规性,而不需要可能可用或可能不可用的外部工具。 (2认同)

Fır*_*ÇÜK 9

对于单线解决方案:

echo "Hello World" | xxd -ps -c 200 | tr -d '\n'
Run Code Online (Sandbox Code Playgroud)

它将打印:

48656c6c6f20576f726c640a
Run Code Online (Sandbox Code Playgroud)

或文件:

cat /path/to/file | xxd -ps -c 200 | tr -d '\n'
Run Code Online (Sandbox Code Playgroud)

对于反向操作:

echo '48656c6c6f20576f726c640a' | xxd -ps -r
Run Code Online (Sandbox Code Playgroud)

它将打印:

Hello World
Run Code Online (Sandbox Code Playgroud)