Ascii / Hex转换为bash

时间:2011-04-20 02:00:51

标签: bash ascii hex

我现在这样做:

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

但这并不是我想要的表现,

Aa的十六进制格式应为4161,但输出为6141 000a,这似乎没有意义。

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

16 个答案:

答案 0 :(得分:49)

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

如果您有xxd(vim附带),则可以使用xxd -r从十六进制转换回来(来自相同格式xxd生成)。如果您只有普通的十六进制(只是'{416}',由xxd -p生成),您可以使用xxd -r -p转换回来。

答案 1 :(得分:17)

对于第一部分,请尝试

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

答案 2 :(得分:13)

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

答案 3 :(得分:7)

对于单线解决方案:

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

答案 4 :(得分:2)

我不知道它看起来多么疯狂,但它确实很好地完成了工作

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

当我试图在HEX中看到我的名字时创建了这个;) 使用它如何使用它:)

答案 5 :(得分:2)

使用bash:

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

6162636465666768696A

答案 6 :(得分:1)

这里有一个小脚本我写的将ascii转换为hex。希望它有所帮助:

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

答案 7 :(得分:1)

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

4161

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

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

echo -n Aa | hexdump -e '/1 "%02x"'; echo

答案 10 :(得分:0)

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

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

将返回4161

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

但是:上面给出的格式会给出重复字符的乘数输出

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

而不是

48656c6c6f

答案 11 :(得分:0)

我使用:

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

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

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

答案 12 :(得分:0)

最后得到了正确的东西

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

答案 13 :(得分:-1)

echo在末尾添加一个回车符。

使用

echo -e

删除额外的0x0A

此外,hexdump默认不会按字节每字节工作。这就是为什么它在一个奇怪的endianess中显示你的字节以及它为什么显示额外的0x00。

答案 14 :(得分:-1)

<ScrollViewer Grid.ColumnSpan="2">
    <RelativePanel Margin="5">
        <Line x:Name="MiddleSplitter" IsHitTestVisible="False" Opacity="0" RelativePanel.AlignHorizontalCenterWithPanel="True" />

        <ListBox Name="AppListBox" Height="150" Margin="5"/>
    </RelativePanel>
</ScrollViewer>

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

答案 15 :(得分:-2)

打算把它写成对@'S Coombs'的评论,但是担心它不合适,评论中的格式化效果不好。

回复:

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

很适合ASCII,但我认为目前大多数发行版的标准是UTF-8(并且在2011年之前很多)。几乎没有上述“使用UTF-8输入做正确的事情”。例如:使用unicode“star”(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 ='★')和“数学Sans-serif小A”(U + 1D5BA =''),如果需要字符值,则需要根据字符值对输出进行编码。低于0x7f的那些可以打印为十六进制(在bash字符串中为\ x7f),但低于~64K的那些需要\ u2605(用于开始)而其余高于64K需要\ U {8十六进制数字}或\ U0001D5BA用于数学A,或类似的东西:

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

但对于最初的问题,这在技术上会“偏离主题” - 但仍然需要注意和考虑。发布生成该输出的解决方案将是“太多的OT文本”以使我感到舒适(希望这个Caveat与原始问题不太相同 - 因为我有类似的'ord','hex'(和​​'chr' ')函数让我在ascii中工作,当UTF-8默认值被混合时,它们变得非常混乱。

虽然上述答案适用于仅支持ascii的系统,但现在这些系统已成为罕见的野兽,特别是因为HTML5的默认字符编码= UTF-8。