我有很多这种字符串,我想找到一个命令将其转换为 ascii,我尝试使用echo -e
and od
,但它不起作用。
0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2
这对我有用。
$ echo 54657374696e672031203220330 | xxd -r -p
Testing 1 2 3$
-r
告诉它将十六进制转换为 ascii,而不是它的正常模式做相反的事情
-p
告诉它使用普通格式。
此代码会将文本0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2
转换为具有等效值的 11 字节流。这些字节将被写入标准输出。
TESTDATA=$(echo '0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2' | tr '.' ' ')
for c in $TESTDATA; do
echo $c | xxd -r
done
正如其他人指出的那样,这不会导致可打印的 ASCII 字符串,原因很简单,即指定的字节不是 ASCII。您需要发布有关如何获得此字符串的更多信息,以便我们为您提供帮助。
工作原理: xxd -r 将十六进制数据转换为二进制(如反向 hexdump)。xxd 要求每行以该行第一个字符的索引号开始(在某事上运行 hexdump 并查看每行如何以索引号开始)。在我们的例子中,我们希望该数字始终为零,因为每次执行只有一行。幸运的是,我们的数据在每个字符之前已经有零作为 0x 符号的一部分。小写的 x 被 xxd 忽略了,所以我们要做的就是将每个 0xhh 字符通过管道传递给 xxd 并让它完成工作。
tr 将句点转换为空格,以便 for 将其正确拆分。
您可以使用xxd
:
$cat hex.txt
68 65 6c 6c 6f
$cat hex.txt | xxd -r -p
hello
你可以使用这样的东西。
$ cat test_file.txt
54 68 69 73 20 69 73 20 74 65 78 74 20 64 61 74 61 2e 0a 4f 6e 65 20 6d 6f 72 65 20 6c 69 6e 65 20 6f 66 20 74 65 73 74 20 64 61 74 61 2e
$ for c in `cat test_file.txt`; do printf "\x$c"; done;
This is text data.
One more line of test data.
您提供的值是 UTF-8 值。设置后,数组:
declare -a ARR=(0xA7 0x9B 0x46 0x8D 0x1E 0x52 0xA7 0x9B 0x7B 0x31 0xD2)
将被解析以打印每个值的明文字符。
for ((n=0; n < ${#ARR[*]}; n++)); do echo -e "\u${ARR[$n]//0x/}"; done
并且输出将产生一些可打印字符和一些不可打印字符,如下所示:
使用以下echo
命令将十六进制值转换为明文:
echo -e "\x<hex value here>"
并使用以下echo
命令将 UTF-8 值转换为纯文本:
echo -e "\u<UTF-8 value here>"
然后使用以下echo
命令将八进制转换为纯文本:
echo -e "\0<octal value here>"
当您有不熟悉的编码值时,请花时间检查常见编码方案中的范围以确定值所属的编码。然后从那里转换很快。
由于echo -e
错误的转义,您一定会失败。以下代码适用于我的类似输出your_program with arguments
:
echo -e $(your_program with arguments | sed -e 's/0x\(..\)\.\?/\\x\1/g')
但是请注意,您的原始十六进制字符串由不可打印的字符组成。
制作这样的脚本:
#!/bin/bash
echo $((0x$1)).$((0x$2)).$((0x$3)).$((0x$4))
例子:
sh converthextoip.sh c0 a8 00 0b
结果:
192.168.0.11