• ベストアンサー

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

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

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)); とすればよいと思います。

ccppmaster
質問者

お礼

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

その他の回答 (2)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

整数演算でもともめるんだったらcharではなくunsigned charにしないと。 最上位ビットがたってたらマイナスになっちゃいます。 シフト演算するんだったらcharでもかまいませんが。

ccppmaster
質問者

お礼

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

  • keroro001
  • ベストアンサー率23% (71/304)
回答No.1

x = (short)s[0] + 256 * (short)s[1]; これでいかんですか?

ccppmaster
質問者

お礼

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

関連するQ&A