ASCII /十六进制转换在bash

问题描述:

我现在做这种方式:ASCII /十六进制转换在bash

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

但它不完全表现为我想,

Aa十六进制形式应该是4161,但输出是6141 000a,这似乎没有道理。

和ASCII码进行十六进制的时候,有另一种工具,这样我不需要前缀\x

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

如果你有xxd(其中附带VIM),你可以使用xxd -r从十六进制转换回(从相同的格式xxd产生)。如果你只是有简单的十六进制(就在“4161”,这是由xxd -p生产),您可以使用xxd -r -p转换回。

+0

'xxd -p -r AAA',这不起作用,它可以直接从命令行检索参数吗? – gdb 2011-04-20 03:49:30

+6

不......并且'r'从十六进制转换回来,你会想要类似''回显4161 | xxd -r -p'“或”echo Aa |“ xxd -p'' – Random832 2011-04-20 04:04:41

对于第一部分,尝试

echo Aa | od -t x1 

它打印逐字节

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

0a是回波产生隐式换行符。

使用echo -nprintf代替。

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

如何将十六进制转换回ascii? – gdb 2011-04-20 02:20:42

$> printf "%x%x\n" "'A" "'a" 
4161 
+0

'''A''''“是什么格式? – gdb 2011-04-20 02:17:56

+0

@gdb:请参阅[printf](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html),其中说:“如果主角是单引号或双引号,则值应该是单引号或双引号后面字符底层代码集中的数字值。“ – 2012-05-30 14:17:59

+0

这里的c风格'printf'解决方案应该是被接受的答案。它是最便携和最简单的,并且符合POSIX标准,无需可能或不可用的外部工具。 – Yokai 2017-10-30 07:41:24

我不知道它是如何疯狂的外观,但它的工作真的很好

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

创造了这个时候,我想看看我的HEX名) 使用你如何使用它: )

这里一点剧本我写的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 

echo在最后追加回车符。

使用

echo -e 

删除多余的0x0A

此外,hexdump都不起作用字节每字节为默认值。这就是为什么它显示你在一个奇怪的endianess字节,为什么它显示你额外的0x00。

根据http://mylinuxbook.com/hexdump/您可以使用hexdump都格式参数

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

将返回4161

在末尾添加一个额外的换行符,追加另一格式。

BUT:上面给出的格式将给乘法器输出为重复字符

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

代替

48656c6c6f 

Text2Conv="Aa" 
for letter in $(echo "$Text2Conv" | sed "s/\(.\)/'\1 /g");do printf '%x' "$letter";done 

诀窍是用sed来解析Text2Conv格式,然后我们可以seper吃了anf循环使用。

使用bash:

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

6162636465666768696A

+0

某些字符(如空格,制表符,\ r,\ n)的错误输出将显示为\ x00 – Giac 2017-10-26 12:12:45

SteinAir的回答上面帮我一把 - 谢谢!以下是一个方式,它的启发,为十六进制字符串转换为ASCII:

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

正想写为@“的库姆斯”评论,但恐怕不适合在评论没有按格式工作得很好。

回复:

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

尼斯ASCII,但我想对大多数发行版的这些天的标准是UTF-8(以及在很多2011年之前)。事实上,上述“UTF-8输入法都没有做到”。例如:使用Unicode的“明星”(U + 2605)上面的代码中推出:

> LC_ALL=en_US.UTF-8  ## making this explicit for this example 
> star="★" 
> hex() { 
    if ((!$#)); then return; fi 
    for ((i=0;i<${#1};i++));do printf %02X \'${$1:$i:1};done 
} 
> hex "$star" 
2605 

如果你想实际的UTF-8十六进制字节组成的明星,你需要 首先设置语言环境。如:

> LC_ALL=C hex "$star" 
E29885 

如果已混合的输出(如拉丁小写 'A'),星形(U + 2605 = '★'),和一个 “数学无衬线小A”(U + 1D5BA =''),并且您想要字符值,那么您需要根据字符值对输出进行编码。那些低于0x7f的文件可以打印为十六进制(在打击字符串中为\ x7f),但低于〜64K的文件需要一个\ u2605(用于开始),其余64K以上的文件需要\ U {8十六进制数字}或\ U0001D5BA数学-A,或者类似的东西:

> star='★' math_a='' 
> locale_hex "a$star$math_a" 
\X61\u2605\U0001D5BA 

但是,这在技术上是去“题外话”为原来的问题 - 但仍然是一个需要注意的&考虑。发布产生该输出的解决方案将会是“太多的OT文本”,因为我的安慰(希望这个警告与原始问题没有太大的分歧 - 因为我有类似的'ord','hex'(和​​'chr ')函数给了我ascii的工作,当UTF-8默认值被引入混合时,这让我非常困惑。

虽然上面的答案对于ascii唯一的系统来说很好,但现在这些问题正在变得罕见,尤其是自HTML5 = UTF-8的默认字符编码以来。

[email protected]:~$ echo -n The quick brown fox jumps over the lazy dog | python -c "print raw_input().encode('hex')," 
54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f67 
[email protected]:~$ 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完成,但不同的是,我是一只懒狗。

+0

'python'!='bash' – Yokai 2017-08-12 10:50:58

+0

既不是'sed','' hexdump“,”printf“,”awk“或”xxd“。 – 2017-08-13 21:17:54

+0

它比其他一些解决方案更短并且可读性更高。它会从Bash命令行转换两种方式。我没有看到你的观点。 – 2017-08-13 21:24:24