- ベストアンサー
エンディアン:2バイトのデータをShort intにしたいのですが?
1.Intelの CPU リトルエンディアンでの、問題です。 バイナリファイルをバイト単位で読込み、これを16ビットの整数にしたいのですが、以下のようにコーディングしましたが、うまくいきません。解決方法をご教示下さい。 char s[2]; short int x; // 16ビットの整数です // s[0] s[1]に、データを読み込みます。 x = (short)(s[0] + 256 * s[1]); 2.同様の問題で、ビッグエンディアンの場合は、どうすればよいかも、ご教示下さい。 よろしくお願いします。
- みんなの回答 (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)); とすればよいと思います。
その他の回答 (2)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
整数演算でもともめるんだったらcharではなくunsigned charにしないと。 最上位ビットがたってたらマイナスになっちゃいます。 シフト演算するんだったらcharでもかまいませんが。
お礼
アドバイスありがとうございます。 まだ、疑問に思っていることがありますので、またよろしくお願いします。
- keroro001
- ベストアンサー率23% (71/304)
x = (short)s[0] + 256 * (short)s[1]; これでいかんですか?
お礼
ご回答ありがとうございます。 試しているデータが悪かったようで、他の方の回答により、この式のままでも良いことが確認出来ました。 ありがとうございました。
お礼
ありがとうございました。 無事、解決いたしました。 ビットシフトを自分なりに考えてやってみていたのですが、単純に足し算したりしてうまくいかなかったので、:-) まだ、疑問に思っていることがたくさんありますので、よろしくお願いします。 ありがとうございました。