我现在这样做:
[root@~]# echo Aa|hexdump -v
0000000 6141 000a
0000003
[root@~]# echo -e "\x41\x41\x41\x41"
AAAA
但这并不是我想要的表现,
Aa
的十六进制格式应为4161
,但输出为6141 000a
,这似乎没有意义。
当执行hex到ascii时,是否有另一个实用程序,所以我不需要前缀\x
?
答案 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 -n
或printf
。
$ 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。