バイナリファイルをリトルエンディアンからビッグエンディアンに変換するonelinerはありますか?


14

およびその逆。

関連する場合、RedHatを実行しています。


6
どのタイプのバイナリファイルですか?
ステファンシャゼル

1
いずれにせよ、どのファイル形式でも、Perlとpack / unpackを使用してエンディアンを変換するワンライナーを作成できると確信しています。一部の形式では、他の形式よりも長い行になります。;-)
イルマリカロネン

回答:


34

このような変換では、バイナリコンテンツの意味を知る必要があるため、これを行うことはできません。

たとえば、バイナリファイル内に文字列がある場合は、変換しないでください。4バイト整数は、2バイト整数とは異なる処理が必要になる場合があります。

つまり、バイト順の変換には、データ型の説明が必要です。


7
私はそれを言うだけでした。バイトのすべてのペアを交換するだけでは簡単ではありません。たとえば、ビッグエンディアンの4バイト整数01 02 03 04は、リトルエンディアンでは次のようになります。04 02 03 01 NOT 02 01 04 03 cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html
Rob

1
合意された、エンディアンはOPは彼の質問を編集していない場合、これは受け入れ答えをする必要があります...生、タイプを持たないバイトストリームにも意味がありません
トーマス・

[要出典]-不明、アプリケーションが明示的に一部のバイト順序を保持し、他のバイト順序を保持しない限り、バイトまたは単語が一貫して一貫して順序付けされるのが通常です。
追って通知があるまで一時停止します。

1
@DennisWilliamson:UTF-8またはASCII文字列にはエンディアンがありません。UTF-8はバイト順を指定しますが、ASCIIは7ビットであり、マルチバイトトークンはありません。UTF-16文字列にはエンディアンがあり、そのエンディアンを示すBOMがある場合とない場合があります。WindowsまたはJavaとやり取りすることを目的としたUnixバイナリには、両方のタイプの文字列が含まれる場合があります。つまり、変換時に区別する必要があります。
ケビン

ここに来て、データの説明とデータを与えて変換するプログラムを探しました。これまでのところ、私はそのようなプログラムを見つけていませんが、それはそれができないという意味ではありません。
レヴィ・モリソン

32

でバイトスワップできddます。それで十分ですか?そうでない場合は、質問を更新して、入力ファイルと予想される出力ファイルの例を示してください。

echo hello >infile
dd conv=swab <infile >outfile

hex infile
   0000 68 65 6c 6c 6f 0a                                 hello.
hex outfile
   0000 65 68 6c 6c 0a 6f                                 ehll.o

2

ファイルの内容を気にせず、単にバイトをスワップしたい場合は、endconvを試してください。これは、標準のバイト変換関数の単なるラッパーであるため、2、4、および8バイトの長整数による変換をサポートしています。ただし、別のプログラムであるため、1つのライナーではありません。


0

ファイルのエンディアンネスを変更するには、ワード(32ビット)サイズを想定して、この1ライナーが機能します。

hexdump -v -e '1/4 "%08x"' -e '"\n"' input_file | xxd -r -p > output_file
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.