2

ソケットを使用してJavaとC#アプリケーションの間で通信するためにmiscutilライブラリを使用しています次のコードの違いを理解しようとしています(これはGroovyですが、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 */

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

4

1 に答える 1

7

これは、Java(JVM)のバイトが署名されているのに対し、C#では署名されていないという事実と関係があります。これは、ビッグエンディアンまたはリトルエンディアンの表現とは何の関係もありません。

つまり、Javaのバイト範囲はから-128 - 127、C#バイトの範囲はから0 - 255です。

したがって、Javaで上記のバイトを表現しようとすると127、オーバーフローしてにラップアラウンドし-120ます。

Javaチュートリアルから:

バイト:バイトデータ型は、8ビットの符号付き2の補数整数です。最小値は-128、最大値は127(両端を含む)です。バイトデータ型は、メモリの節約が実際に重要である大規模な配列でメモリを節約するのに役立ちます。また、制限がコードを明確にするのに役立つintの代わりに使用することもできます。変数の範囲が制限されているという事実は、ドキュメントの形式として役立ちます。

MSDNから:

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

于 2010-04-08T05:16:31.837 に答える