• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:バイナリ読み込みについて)

バイナリ読み込みについて

このQ&Aのポイント
  • バイナリファイルの読み込みについて質問します。
  • C#でushort型のバイナリ書き込み例と、Javaでのushort型データのバイナリ読み込み方法について困っています。
  • C#で書き込んだ値5000をJavaで取得したいのですが、うまくいきません。C#のushort型とJavaのreadUnsignedShortメソッドの相違点についてご教授ください。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

全部16進数で書くとわかりやすいのでは。 5000→0x1388 34835→0x8813 -30701→0x8813(下16bit) byte[0]=-120→0x88(下8bit) byte[1]=19→0x13 16ビットを8bitずつに分解して、ファイルやメモリに格納する場合、唯一絶対の順番というはありません。 それぞれの環境に都合のいいように並んでいます。 Windows等で使われるインテル系CPUでは、下位→上位の順の方が都合がいいので、ファイルにもその順番に書くことが多いです。 例の 5000(=0x1388)だったら、 0x88 0x13 の順番です。 この順番を通称「リトルエンディアン」と呼びます。 逆に、上位→下位の順が都合のいい環境もあります。この場合は 例の 5000(=0x1388)だったら、 0x13 0x88 の順番です。 この順番を通称「ビッグエンディアン」と呼びます。 この順番が統一できてなければ、正しく数値のやりとりはできません。 解決策は、順番を揃えること。 ・C#で書くときに上位→下位の順番になるようにする あるいは ・Javaで読むときにreadUnsignedShortを使わずに、2バイト読み込み→下位,上位としてintに変換 とする http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/io/DataInput.html#readUnsignedShort%28%29 には > a を 1 番目のバイト、b を 2 番目のバイトとすると、戻り値は次のようになります。 > (((a & 0xff) << 8) | (b & 0xff)) とあるので、このaとbを逆にした式で計算すればよいです。 なお、 > byte[0]と[1]を足しても-101になり 上のa=[0],b=[1]として計算すれば、34835になります。 上位と下位をただ足すのは意味がありません。

Web_Master
質問者

お礼

非常に解りやすい説明ありがとうございます。 なるほど。言語によって上位と下位の取り扱いが違うのですね。 大変勉強になりました。 unsignedするために & 0xff し、下位を8bit左シフトした論理和で 無事、値を取得できました。 大変ありがとうございましたm(_ _)m

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

その他の回答 (2)

  • f272
  • ベストアンサー率46% (8652/18506)
回答No.2

5000=0x1388 34835=0x8813 と書けば一目瞭然です。バイトオーダが変わってますね。上位バイトと下位バイトを入れ替えてください。

Web_Master
質問者

お礼

素早い返信ありがとうございます。 言語によって上位と下位の取り扱いが違う事は非常に勉強になりました。 大変ありがとうございましたm(_ _)m

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

符号無し2バイトで5000を表しているデータを読み込んだら34835になったのであれば、それはエンディアンの問題だと思われます。 10進数の5000を16進数に直すと0x1388です。その上位・下位バイトを逆にすると0x8813で、10進数に戻すと34835となりますから。 JavaのDataInputStreamでは読み込むデータをビッグエンディアンとして扱うのに対し、C#ではリトルエンディアンで扱っているのだと考えられます。 リトルエンディアンのデータをJavaで読み込むには、readUnsignedByte()で2バイト読み込んで、(2バイト目 << 8) + 1バイト目を計算すればいいでしょう。

Web_Master
質問者

お礼

素早い返信ありがとうございます。 言語によって上位と下位の取り扱いが違う事は非常に勉強になりました。 大変ありがとうございましたm(_ _)m

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

関連するQ&A