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

我在一些脚本中乱砍,试图解析由Javas DataOutputStream#writeLong(...)编写的一些数据。 由于java似乎总是写大端,我在将字节输入od遇到问题。 这是因为od总是假设endianess与你当前所在的arch的endianess相匹配,而且我在一个小端机器上。

我正在寻找一个简单的单行程来反转字节顺序。 假设你知道文件的最后8个字节是由前面提到的writeLong(...)方法写的长的。 我目前打印这篇文章的最佳尝试是

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

,但是tac似乎只对文本起作用(足够公平)。 我发现了一些对dd conv=swab引用,但这只是成对交换字节,并且不能反转这8个字节。

有谁知道这个好的单行程?

最终到了Perl。 使用我在PERL One Liners找到的单线 :

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

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

其他建议是受欢迎的。

编辑:在评论tac.c中找到另一个命令,我从GNU coreutils下载:

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

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

要逐字节地反转文件,请使用(在bash,ksh或sh中): tac -r -s’。 ‘档案

你可以使用objcopy:

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

其中num为2或4。

注意下一版本的GNU coreutils(> = 8.23)会在od命令中添加–endian = {little,big}选项

我想出了这个Perl单行程序,将4字节整数从一个字节序转换为另一个字节序:

 $ perl -e 'open F,shift; do { read(F,$a,4); print scalar reverse($a);} while(!eof(F));' bigend.bin > littlend.bin 

这可能在真正的Linux机器上工作正常,但是Cygwin最终给我的位置,将二进制文件视为文本并在每个0x0A字节(也称为换行符)之前插入0x0D(也就是CR)。 但如果你管cat -它似乎不管它。 这对我有用:

 $ perl -e 'open F,shift; do { read(F,$a,4); print scalar reverse($a);} while(!eof(F));' bigend.bin | cat - > littlend.bin 

BASH:

 od -b -v -w8 | while read pfx b8 ; do [ "$b8" ] && echo -n 12345678 | tr 87654321 \\${b8// /\\} ; done 

为了更加健壮,取决于od的输出样式,它可能需要压缩空格(在w8之后插入"| sed 's/ */ /g'" )。

用过dd,卢克!

 dd if=sourcefile of=resultfile conv=swab