Ale*_*ing 12 java swap endianness dataoutputstream
我在一些脚本中乱砍,试图解析Javas编写的一些数据DataOutputStream#writeLong(...)
.由于java似乎总是写大端,我在将字节输入时遇到问题od
.这是因为od
总是假设endianess与你当前所在的arch的endianess匹配,而且我在一个小端机器上.
我正在寻找一个简单的单行程来反转字节顺序.假设你知道文件的最后8个字节是由前面提到的writeLong(...)
方法编写的.我目前打印这篇文章的最佳尝试是
tail -c 8 file | tac | od -t d8
Run Code Online (Sandbox Code Playgroud)
,但tac
似乎只对文本有效(足够公平).我找到了一些引用dd conv=swab
,但这只是成对交换字节,并且不能反转这八个字节.
有谁知道这个好的单行程?
小智 10
用过dd,卢克!
dd if=sourcefile of=resultfile conv=swab
Run Code Online (Sandbox Code Playgroud)
最终到了Perl.使用我在PERL One Liners找到的单线:
tail -c 8 file | perl -0777e 'print scalar reverse <>' | od -t d8
Run Code Online (Sandbox Code Playgroud)
该0777
分离器字符是一个有点令人费解给我,但这个页面在Debian的管理员似乎表明,它是"无记录分隔符"占位符,引发了完整的反向字节每字节.
其他建议是受欢迎的.
编辑:在评论tac.c中找到另一个命令,我从GNU coreutils下载:
如果没有给出FILE或标准输入,或者遇到FILE名称" - ",则将每个文件或标准输入复制到标准输出,并反转记录的顺序.记录由字符串实例分隔,如果没有给出,则换行符.默认情况下,分隔符字符串附加到它在文件中跟随的记录的末尾.
选项:-b, - before分隔符附加到文件前面的记录的开头.-r, - regex分隔符是正则表达式.-s, - separator = separator使用SEPARATOR作为记录分隔符.
要逐字节地反转文件,请使用(在bash,ksh或sh中): tac -r -s'.'档案
小智 8
你可以使用objcopy:
$ objcopy -I binary -O binary --reverse-bytes=num inputfile.bin outputfile.bin
Run Code Online (Sandbox Code Playgroud)
其中num为2或4.