13

Javaで記述されたデータを解析しようとしているスクリプトをハッキングしていますDataOutputStream#writeLong(...)。javaは常にビッグエンディアンを書き込むように見えるので、バイトをにフィードするのに問題がありますod。これはod、エンディアンが現在使用しているアーチのエンディアンと一致していることを常に想定しているためです。私は小さなエンディアンマシンを使用しています。

バイトオーダーを逆にする簡単なワンライナーを探しています。ファイルの最後の8バイトが前述のwriteLong(...)方法で長い書き込みであることがわかっているとします。これだけ長く印刷する私の現在の最善の試みは

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

、しかしtacテキストでのみ機能するようです(十分に公平です)。への参照をいくつか見つけましdd conv=swabたが、これはペアでバイトを交換するだけであり、これらの8バイトを元に戻すことはできません。

誰かがこれのための良いワンライナーを知っていますか?

4

6 に答える 6

13

objcopyを使用できます。

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

ここで、numは2または4のいずれかです。

于 2013-10-10T06:05:49.803 に答える
9

最終的にPerlに頼りました。PERL One Linersで見つけたワンライナーを使用しました:

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

0777区切り文字は私には少し不可解でしたが、debian adminのこのページは、それが「レコード区切りなし」のプレースホルダーであり、完全な逆バイト/バイトをトリガーすることを示唆しているようです。

他の提案も歓迎します。

編集:GNUcoreutilsからダウンロードしたtac.cへのコメントで別のコマンドを見つけました:

各FILE、または何も指定されていない場合、またはFILE名が「-」の場合は標準入力を、レコードの順序を逆にして標準出力にコピーします。レコードは、文字列のインスタンス、または何も指定されていない場合は改行で区切られます。デフォルトでは、区切り文字列は、ファイル内で後続するレコードの最後に付加されます。

オプション:-b、-beforeセパレーターは、ファイル内で先行するレコードの先頭に付加されます。-r、-regexセパレータは正規表現です。-s、-separator=separatorレコード区切り文字としてSEPARATORを使用します。

ファイルをバイトごとに反転するには、(bash、ksh、またはshで)次を使用します 。tac-r-s'。\| ' ファイル

于 2011-06-22T14:02:31.987 に答える
5

使用済みdd、ルーク!

dd if=sourcefile of=resultfile conv=swab
于 2015-07-28T17:15:53.257 に答える
3

GNU coreutilsの次のバージョン(> = 8.23)は、odコマンドに--endian = {little、big}オプションを追加することに注意してください。

于 2014-02-08T19:46:13.197 に答える
2

私はこの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
于 2013-03-08T18:52:19.997 に答える
1

BASH:

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

の出力スタイルに応じてもう少し堅牢にするために、odスペースを圧縮する必要がある場合があります("| sed 's/ */ /g'"の後に挿入しますw8)。

于 2014-07-09T15:09:42.417 に答える