c#とjavaのビッグエンディアンバイトの違いは、miscutilを使用しています

StackOverflow https://stackoverflow.com/questions/2597715

質問

私は使用しています その他 ソケットを使用してJavaとC#アプリケーションの間で通信するライブラリ。私は次のコードの違いを把握しようとしています(これはグルーヴィーですが、Javaの結果は同じです):

import java.io.*

def baos = new ByteArrayOutputStream();
def stream = new DataOutputStream(baos);
stream.writeInt(5000)

baos.toByteArray().each { println it }

/* outputs - 0, 0, 19, -120 */

およびC#:

using (var ms = new MemoryStream())
using (EndianBinaryWriter writer = new EndianBinaryWriter(EndianBitConverter.Big, ms, Encoding.UTF8))
{
  writer.Write(5000);
  ms.Position = 0;
  foreach (byte bb in ms.ToArray())
  {
    Console.WriteLine(bb);
  }
}

/* outputs - 0, 0, 19, 136 */

ご覧のとおり、最後のバイトはです -120 Javaバージョンと 136 C#で。

役に立ちましたか?

解決

これは、Java(JVM)のバイトが署名されており、C#ではそうではないという事実に関係しています。それは、大規模または小さなエンディアンの表現とは何の関係もありません。

言い換えれば、Javaのバイトはからです -128 - 127, 、およびC#バイトの範囲 0 - 255.

したがって、上記のバイトを表しようとするとき 127 Javaでは、オーバーフローして包み込みます -120.

から Javaチュートリアル:

バイト: バイトデータ型は、8ビットの署名された2つの補完整数です。最小値は-128で、最大値は127(包括的)です。バイトデータ型は、メモリの節約が実際に重要な大きな配列でメモリを保存するのに役立ちます。また、制限がコードを明確にするのに役立つINTの代わりに使用することもできます。変数の範囲が制限されているという事実は、ドキュメントの形式として機能する可能性があります。

から MSDN:

バイト値タイプは、0〜255の範囲の値を持つ符号なしの整数を表します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top