プロが教えるわが家の防犯対策術!

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

A 回答 (3件)

SunOSとLinux(Intel)のマルチプラットホームに対応しているアプリケーションならアプリケーション自体が変換に対応しているはずなんですが。



ファイルフォーマットがわかっているのであれば標準コマンドのddで変換できることがあります。
ただ、あまりに複雑なフォーマットは無理です。
man 1 dd

フォーマットが複雑ならperlなどでスクリプトを作ったほうが早いかもしれません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2000/12/14 21:58

ぅ~ん...



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

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

お礼日時:2000/12/14 22:01

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;
}

というような関数(群)を作って、読むたびに変換してから利用す
ればいいのです。(動かしてないので、バグがあるかも)
    • good
    • 0
この回答へのお礼

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

お礼日時:2000/12/14 22:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!