Ascii/Hex 在 bash 中转换
Posted
技术标签:
【中文标题】Ascii/Hex 在 bash 中转换【英文标题】:Ascii/Hex convert in 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
了?
【问题讨论】:
【参考方案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 -n
或printf
。
$ 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
sed
、hexdump
、printf
、awk
或 xxd
都不是。
它比其他一些解决方案更短,并且可以说更具可读性。它从 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 <<< "Hello, world!"
【参考方案15】:
echo 在末尾附加一个回车。
使用
echo -e
去除多余的0x0A
此外,默认情况下,hexdump 不能按字节工作。这就是为什么它以奇怪的字节顺序向您显示字节以及为什么它向您显示额外的 0x00。
【讨论】:
以上是关于Ascii/Hex 在 bash 中转换的主要内容,如果未能解决你的问题,请参考以下文章