用于反转字节顺序/更改字节序的命令行

2022-09-04 06:16:33

我正在一些脚本中四处奔波,试图解析Javas编写的一些数据。由于java似乎总是写大字节序,所以我有一个问题,将字节提供给.这是因为总是假设端性与你当前所在的拱门的端性相匹配,而我在一个小端机上。DataOutputStream#writeLong(...)odod

我正在寻找一个简单的单行线来反转字节顺序。假设您知道文件的最后8个字节是由上述方法编写的长篇。我目前打印这么长的最佳尝试是writeLong(...)

tail -c 8 file | tac | od -t d8

,但似乎只在文本上工作(足够公平)。我找到了一些对 的引用,但这只会成对交换字节,并且无法反转这八个字节。tacdd conv=swab

有谁知道一个好的单行线?


答案 1

你可以使用 objcopy:

$ objcopy -I binary -O binary --reverse-bytes=num inputfile.bin outputfile.bin

其中 num 为 2 或 4。


答案 2

最后求助于Perl。使用了我在PERL One Liners上找到的单行:

tail -c 8 file | perl -0777e 'print scalar reverse <>' | od -t d8

分隔符 char 对我来说有点令人费解,但是 debian 管理员的这个页面似乎暗示它是“无记录分隔符”的占位符,触发了一个完整的反向字节每字节。0777

欢迎提出其他建议。

编辑:在对tac.c的评论中发现了另一个命令,这是我从GNU coreutils下载的:

将每个 FILE 或标准输入(如果未给出任何输入)或遇到 FILE 名称“-”时,复制到标准输出,并反转记录的顺序。记录由字符串实例分隔,如果没有给出,则用换行符分隔。默认情况下,分隔符字符串附加到它在文件中所跟随的记录的末尾。

选项:-b, --之前 分隔符附加到文件中它前面的记录的开头。-r, --正则表达式 分隔符是正则表达式。-s, --分隔符=分隔符 使用分隔符作为记录分隔符。

要逐个字节地反转文件,请使用(在 bash、ksh 或 sh 中):tac -r -s '。\|' 文件


推荐