5

Javaには次の行があります:

new byte[]{59, 55, 79, 1, 0, 64, -32, -3};

ただし、C# では、バイト配列で負のバイトを使用できません。バイトにキャストしようとしましたが、失敗しました。私に何ができる?ありがとう!

4

4 に答える 4

9

C# ではバイトはunsignedであるためです。Java では、バイトはsignedです。

からByte Structure

Byte は、0 (Byte.MinValue 定数で表される) から 255 (Byte.MaxValue 定数で表される) の範囲の値を持つ符号なし整数を表す不変の値型です。

からPrimitive Data Types

バイト データ型は、8 ビットの符号付き 2 の補数整数です。最小値は -128、最大値は 127 です。

私に何ができる?

sbyte8 ビットの符号付き整数を表す C# で使用できます。

SByte 値型は、負の 128 から正の 127 までの範囲の値を持つ整数を表します。

お気に入り;

sbyte[] sb = new sbyte[] {59, 55, 79, 1, 0, 64, -32, -3};
于 2013-08-25T12:20:51.533 に答える
7

Java の a の考え方に近づけるために、次をbyte使用しますsbyte

var data = new sbyte[] { 59, 55, 79, 1, 0, 64, -32, -3 };

そして、おそらく他の変数sbyteも同様に変更する必要があります。

于 2013-08-25T12:25:44.913 に答える
4

Java ではバイトは符号付きで、C# ではバイトは符号なしです。数値に 256 を追加することで、符号付きから符号なしに変換できるため、(この例では) -32 は 224 になり、-3 は 253 になります。

Ichabod Clay が (コメントで) 言ってsbyteいるように、その変換を行う必要がないように型を使用することもできます。個人的には符号付きバイトが嫌いなので、これがリテラル データの場合は、一度変換するだけで完了しますが、選択肢があります。わーい。:-D

于 2013-08-25T12:19:53.447 に答える
2

一般に、符号付きを符号なしにキャストして、元に戻すだけです。とにかく、ほとんどの場合、バイトのビット値に関心があります。これらは両方のシステムで同じままです (2 の補数の符号付き数が定義されているため)。より多くのビットを使用する値にアップキャストし、符号なしの正の数に変換する場合は、必要なビット数に 1 ビットを使用してビットごとの AND を使用するだけです。

C#では、使用できます

int negInt = (sbyte) b;
byte anotherB = (byte) negInt;

および Java では次のように使用します。

int posInt = b & 0xFF;
byte anotherB = (byte) posInt;

バイトの値が数値として必要な場合は、このような機能を使用できます。それ以外の場合は、符号付きまたは符号なしのバイト配列にビットを格納するだけです。

このメソッドは、C# の例で使用したように、バイト配列全体の指定にも機能するはずです。

new byte[] {59, 55, 79, 1, 0, 64, (byte)-32, (byte)-3};

あるいは

new byte[] {(byte)59, (byte)55, (byte)79, (byte)1, (byte)0, (byte)64, (byte)-32, (byte)-3};

unchecked()C# を使用している場合は、追加する必要がある場合があります。

同じことが Java にも当てはまります。

new byte[] { (byte) 255, etc. }

この種の変換では、お気に入りのエディターで検索/置換の正規表現を使用する方法を学びたいと思うかもしれません。

最終的には、キャストとビットごとの AND を少しいじって、その感覚をつかむ必要があります。理解したら、それは決してあなたを離れることはありません。

于 2013-08-25T12:40:29.723 に答える