- 締切済み
ビッグエンディアンをPCで処理する問題
ビッグエンディアンと指定されているバイナリファイルがあります。 これをPC(intel系,Linux or Windows)で処理する場合、エンディアンの変換が必要だろうと思います。具体的にはどのようにするのでしょうか。ネットでもダウンロードできそうですが。 変換コマンド -btol ファイル名(ビッグ)> ファイル名(リトル) という感じですかね。こんなものあるでしょうか。 購入したバイナリファイルなのですが、このご時勢たいていPCで処理するわけでしょうからリトルであってほしいものだと思いますが。 ところでMACはビッグとリトルのどっちなのでしょうか。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- aid-u
- ベストアンサー率75% (22/29)
#2の方の言われるとおり、レイアウトが分からないと難しいでしょう。 2byteデータ変換メソッド、4byteデータ変換メソッド、8byteデータ変換メソッドはそれぞれ作成できます。 しかし、1レコードが4byteのデータのレイアウトが下記のように異なっている場合、変換結果は異なることになります。 1)1byteデータ 1byteデータ 2byteデータ 2)2byteデータ 2byteデータ このため、一般的にはレイアウトが分からないと変換は困難だと思います。
- 小田 力(@ricky-oda)
- ベストアンサー率55% (46/83)
google で検索したらこのようなものが見つかりました. 使えるのではないでしょうか? エンディアン変換スクリプト http://mausam.hyarc.nagoya-u.ac.jp/~mhori/scripts/endian-exchange/
- lv4u
- ベストアンサー率27% (1862/6715)
>>という風なプログラムだと思います。具体的なプログラムの書き方を教えて頂きたいのですが。 えーと、元々、購入したデータがリトルエンディアンだったとしても、バイナリファイルの場合にはレイアウトが分からないと処理できません。なので、イロイロなサイズのレコード(可変長)だった場合はもとより、固定長でも、いまのままでは処理できない可能性が大きいですね。 なお、データ変換プログラムは、そういう流れになります。その後のデータ処理のプログラムと比較して、かなり簡単な部類になると思いますので、こてしらべ的に自分で考えて(ネットで探して等)作られたほうがいいと思います。これが自力でできないなら、その後の処理プログラムも作れないと思います。 (また、バイナリエディタでファイルをながめていると、レイアウトはだいたい予想できることも多いです) なお、「ビッグ-->リトルの変換さえできればいい」ということなら、Perlのようなスクリプト言語での処理も可能です。 C言語で作るよりもお手軽なので、私は、この手の処理が必要な場合、Perlを使っています。 ちなみにMacは、CPUが68系(モトローラ)のモデルはビッグで、86系(インテル)のモデルはリトルです。個人的には、68系が直交性あるマシン語セットで好きだったんですけどね。
- lv4u
- ベストアンサー率27% (1862/6715)
ANo.2さんの言われるとおり、レイアウトが分からないと難しいです。でも、それを質問者さんはPCで処理したいと思われているのでしょうから、レイアウトを知ることは可能なのではないですか? レイアウトさえわかれば、あとは、short,int,long等のバイトを入れ替える関数を呼び出しながらデータを変換して書き出すプログラムを書けばOKです。charやstringはそのまま書き出します。 C言語では、参照URLにあるような関数を呼び出せば、変換できます。なおネットのデータはビッグエンディアンで流れています。
- wolf03
- ベストアンサー率22% (241/1086)
データレイアウトが分からない以上、エンディアン変換は不可能です。 数値は型により1~8byteの物があり2byte以上の物を変換、さらに文字は変換しません。 自力でレイアウトに合わせて変換するプログラムを作りましょう。
お礼
回答、ありがとうございました。ご指摘のことはデータのタイプとかサイズによっていろいろなので普遍的な変換方法はない、ということでしょうか。問題となっているデータは文字ではなく、数字です。私の考えでは8ビットだったら、ABCDEFGH→HGFEDCBAとすれば反転が完了するのではないかということですが、違うでしょうか。±で問題が発生するかも。分かりませんが。ネット上ではエンディアン変換ツールもあるみたいですが、使えるのかなと思案しています。
- 小田 力(@ricky-oda)
- ベストアンサー率55% (46/83)
興味深い話題ですね. 以下の URL が参考になりそうです. 「ビッグエンディアンとリトルエンディアンの意味とその変換方法」 http://digital.ni.com/public.nsf/allkb/008AB70CC5F0EB6B862570800029364E 「[tips]ビッグエンディアンとリトルエンディアン」 http://son-son.sakura.ne.jp/programming/tips.html
お礼
ありがとうございます。データの種類と個数が分かれば、サイズ×個数でファイルサイズが計算でき、これが実際のファイルサイズと一致すれば処理できると思います。実際には様々なサイズのファイルが混入されているバイナリファイルだったらどうするのかという問題があるように思いますが、どうしたらよいのでしょうか。 また、プログラムの構造としては、 1.ファイルを開く(読み込み、書き込み) 2.変数にデータを読み込む 3.変数変換関数を通す(ntohs(),ntohl(); ビッグ→リトル) 4.変換された変数を書き込みファイルに出力 5. 2,3,4をファイル終了まで繰り返す 6.ファイルを閉じる という風なプログラムだと思います。具体的なプログラムの書き方を教えて頂きたいのですが。C言語のテキストに載ってそうですけど。私は以前フォートランでやったことはあるのですが。