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
转换回。
对于第一部分,尝试
echo Aa | od -t x1
它打印逐字节
$ echo Aa | od -t x1
0000000 41 61 0a
0000003
的0a
是回波产生隐式换行符。
使用echo -n
或printf
代替。
$ printf Aa | od -t x1
0000000 41 61
0000002
如何将十六进制转换回ascii? – gdb 2011-04-20 02:20:42
$> printf "%x%x\n" "'A" "'a"
4161
'''A''''“是什么格式? – gdb 2011-04-20 02:17:56
@gdb:请参阅[printf](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html),其中说:“如果主角是单引号或双引号,则值应该是单引号或双引号后面字符底层代码集中的数字值。“ – 2012-05-30 14:17:59
这里的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
某些字符(如空格,制表符,\ 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完成,但不同的是,我是一只懒狗。
'python'!='bash' – Yokai 2017-08-12 10:50:58
既不是'sed','' hexdump“,”printf“,”awk“或”xxd“。 – 2017-08-13 21:17:54
它比其他一些解决方案更短并且可读性更高。它会从Bash命令行转换两种方式。我没有看到你的观点。 – 2017-08-13 21:24:24
'xxd -p -r AAA',这不起作用,它可以直接从命令行检索参数吗? – gdb 2011-04-20 03:49:30
不......并且'r'从十六进制转换回来,你会想要类似''回显4161 | xxd -r -p'“或”echo Aa |“ xxd -p'' – Random832 2011-04-20 04:04:41