在十字命令行中将十六进制字符串转换为ascii

时间:2012-10-31 14:33:38

标签: bash hex

我有很多这种字符串,我想在ascii中找到一个转换它的命令,我尝试使用echo -eod,但它没有用。

0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2

7 个答案:

答案 0 :(得分:99)

这对我有用。

$ echo 54657374696e672031203220330 | xxd -r -p
Testing 1 2 3$

-r告诉它将十六进制转换为ascii而不是正常的反向模式

-p告诉它使用普通格式。

答案 1 :(得分:16)

此代码将文本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将句点转换为空格,以便将其正确分割。

答案 2 :(得分:5)

你可以使用这样的东西。

$ 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.

答案 3 :(得分:3)

您可以使用xxd

$cat hex.txt
68 65 6c 6c 6f
$cat hex.txt | xxd -r -p
hello

答案 4 :(得分:1)

由于错误的转义,echo -e一定是失败的。 以下代码适用于your_program with arguments的类似输出:

echo -e $(your_program with arguments | sed -e 's/0x\(..\)\.\?/\\x\1/g')

但请注意,您的原始十六进制字符串由不可打印的字符组成。

答案 5 :(得分:0)

您提供的值是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

输出将产生一些可打印的字符和一些不可打印的字符,如下所示:

enter image description here

使用echo命令将十六进制值转换为纯文本:

echo -e "\x<hex value here>"

使用echo命令将UTF-8值转换为纯文本:

echo -e "\u<UTF-8 value here>"

然后使用echo命令将八进制转换为纯文本:

echo -e "\0<octal value here>"

如果您有不熟悉的编码值,请花些时间检查常用编码方案中的范围,以确定值所属的编码。然后从那里进行转换。

答案 6 :(得分:0)

制作一个像这样的脚本:

“#!/ bin / bash

回显$((0x $ 1))。$((0x $ 2))。$((0x $ 3))。$((0x $ 4))“

示例:

“ sh converthextoip.sh c0 a8 00 0b”

结果:

192.168.0.11