• ベストアンサー

CPU依存によりバイナリが違う

SunOS4.0からLinuxにバイナリを移したところ2バイト以上のデータだと前後バイトのデータが逆になるという問題が起こりました。人にはCPUがIntelだからだと聞きました。CPUが違うバイナリを整形するフィルタなどはないでしょうか?データの解析ができずに困っております。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

Big Endian (Sun) と Little Endian (Intel) の問題ですね。 toysmith さんのいうように、ファイルのフォーマットに依存する と思います。非常に単純に short のデータが並んでいるだけとか、 long が並んでいるだけなら、 #!/usr/local/bin/perl while (read(STDIN, $long, 4) == 4) { print join('',reverse(split('',$long))); } という簡単なスクリプトで変換できます。double とか float も同 じです。 しかし、いろんなサイズのバイナリデータが混在してたり、文字が 入ってたりすると、自分で変換プログラムを作る必要があります。 そうはいっても、読むプログラムがあるわけですから、何らかの規 則で並んでいるはずで、上のスクリプトを適当にいじれば作れるで しょう。 あと考えつくのは、データは変換せずに、Linux 側のプログラムを 改造して、SunOS の方式で書かれたデータをそのまま読めるように してしまうことです。 例えば、 long endianswaplong(long l) { int i; long tmp; for (i=0; i<sizeof(long); i++) { ((char*)&tmp)[i] = ((char*)&l)[sizeof(long)-i-1]; } return tmp; } というような関数(群)を作って、読むたびに変換してから利用す ればいいのです。(動かしてないので、バグがあるかも)

amu
質問者

お礼

わざわざルーチンまで書いていただき本当にありがとうございます。早速試してみます。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • tullio
  • ベストアンサー率20% (11/53)
回答No.2

ぅ~ん... エンディアン問題のことではないのですか? ビットが逆になるということでしたら,練習だと思ってC言語でチャッとフィルターを書いてみてはいかがでしょうか. 1バイト読んでは全ビットを並び替えるだけです.

amu
質問者

お礼

はい。あのあと調べて「バイトオーダー」とか「エンディアン」と呼ばれるものだと言う事がわかりました。途中にchar型なども混在するかなり面倒なデータなのですが、フォーマットはわかっているので地道にやることにします。初心者だとキーワードがわからなくて検索しても引っかからないことが多いです。そういったキーワードヲ教えていただけるだけでも非常に助かります。どうもありがとうございました。

すると、全ての回答が全文表示されます。
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.1

SunOSとLinux(Intel)のマルチプラットホームに対応しているアプリケーションならアプリケーション自体が変換に対応しているはずなんですが。 ファイルフォーマットがわかっているのであれば標準コマンドのddで変換できることがあります。 ただ、あまりに複雑なフォーマットは無理です。 man 1 dd フォーマットが複雑ならperlなどでスクリプトを作ったほうが早いかもしれません。

amu
質問者

お礼

全部で512バイトのヘッダと数百MBのデータ部とが有ります。ヘッダ部はビットフィールドも駆使するなどかなり複雑なので、自分でルーチンを作ることにします。 すぐに教えていただきありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A