プロが教える店舗&オフィスのセキュリティ対策術

1.Intelの CPU リトルエンディアンでの、問題です。
バイナリファイルをバイト単位で読込み、これを16ビットの整数にしたいのですが、以下のようにコーディングしましたが、うまくいきません。解決方法をご教示下さい。

char s[2];
short int x;   // 16ビットの整数です
// s[0] s[1]に、データを読み込みます。
x = (short)(s[0] + 256 * s[1]);


2.同様の問題で、ビッグエンディアンの場合は、どうすればよいかも、ご教示下さい。
よろしくお願いします。

A 回答 (3件)

char s[2];


short int x;
// s[0], s[1]にデータを読み込む
x = (short)((s[0] & 0xff) | ((s1[1] << 8) & 0xff00));

でどうでしょうか?

これはCPUがビッグエンディアンの場合でも同じです。
ファイルへの格納形式がビッグエンディアンの場合、CPUがリトルエンディアンかビッグエンディアンかに関わらず、

x = (short)((s[1] & 0xff) | ((s1[0] << 8) & 0xff00));

とすればよいと思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。
無事、解決いたしました。
ビットシフトを自分なりに考えてやってみていたのですが、単純に足し算したりしてうまくいかなかったので、:-)
まだ、疑問に思っていることがたくさんありますので、よろしくお願いします。
ありがとうございました。

お礼日時:2005/07/08 17:13

整数演算でもともめるんだったらcharではなくunsigned charにしないと。


最上位ビットがたってたらマイナスになっちゃいます。

シフト演算するんだったらcharでもかまいませんが。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
まだ、疑問に思っていることがありますので、またよろしくお願いします。

お礼日時:2005/07/08 17:16

x = (short)s[0] + 256 * (short)s[1];


これでいかんですか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
試しているデータが悪かったようで、他の方の回答により、この式のままでも良いことが確認出来ました。
ありがとうございました。

お礼日時:2005/07/08 17:15

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