我正在尝试在脚本中将字节写入系统上的文件,并决定使用 xxd(带 -r)来实现此目的。但是,我希望它考虑每 4 个字节的字节顺序。下面是我用来测试此操作的一个例子:
echo "1122334455667788" | xxd -r -p -g 4 - outfile
当我这样做时,我得到以下输出hexdump outfile
:
0000000 2211 4433 6655 8877
0000008
因为我使用了-g 4,所以我期望结果是这样的
0000000 4433 2211 8877 6655
0000008
它的表现与我预期的不一样。我做错了什么?
编辑:
我现在意识到 -g 不应该改变字节顺序。但是,xxd 确实考虑了字节顺序,就像我提供的示例一样。现在的问题是,我如何让 xxd 以 4 个字节(32 位小端值)为一组而不是每 2 个字节翻转一次字节,以获得我想要的结果?仅使用 xxd 是否可能?
答案1
因为该-g
选项旨在用于直接(而非反向)转换,并且仅用于格式化用户所见的输出:
$ printf '\x20\x21\x22\x23\x24\x25\x26\x27\n'
!"#$%&'
$ printf '\x20\x21\x22\x23\x24\x25\x26\x27\n' | xxd
00000000: 2021 2223 2425 2627 0a !"#$%&'.
$ printf '\x20\x21\x22\x23\x24\x25\x26\x27\n' | xxd -g 4
00000000: 20212223 24252627 0a !"#$%&'.
为了获得字节值的表示以改变最高有效位的顺序,您需要一个实际上可以进行转换的工具:
printf '\x20\x21\x22\x23\x24\x25\x26\x27\n' | od -An -tx4
23222120 27262524 0000000a
然后使用 xxd 将这些字节值反转为实际字节:
printf '\x20\x21\x22\x23\x24\x25\x26\x27\n' | od -An -tx4 | xxd -r -p
#"! '&%$
请注意,每四个字节的组中各个字节的顺序已经被反转。