193

を に変換する必要があるのは、 を使用する方法の 1 つintです。しかし、それが次の仕様に一致するかどうかはわかりません。byte[]BitConverter.GetBytes()

XDR 符号付き整数は、[-2147483648,2147483647] の範囲の整数をエンコードする 32 ビットのデータです。整数は 2 の補数表記で表されます。最上位バイトと最下位バイトは、それぞれ 0 と 3 です。整数は次のように宣言されます。

ソース:RFC1014 3.2

上記の仕様を満たす int から byte への変換を行うにはどうすればよいですか?

4

9 に答える 9

243

RFC は、符号付き整数は通常の 4 バイト整数であり、バイトがビッグエンディアンで並べられていると言いたいだけです。

現在、リトルエンディアンのマシンで作業している可能性が高くBitConverter.GetBytes()、逆の結果が得られるでしょうbyte[]。だからあなたは試すことができます:

int intValue;
byte[] intBytes = BitConverter.GetBytes(intValue);
Array.Reverse(intBytes);
byte[] result = intBytes;

ただし、コードの移植性を最大限に高めるには、次のようにします。

int intValue;
byte[] intBytes = BitConverter.GetBytes(intValue);
if (BitConverter.IsLittleEndian)
    Array.Reverse(intBytes);
byte[] result = intBytes;
于 2009-08-23T16:33:00.580 に答える
45

これを行う別の方法は次のとおりです。1x バイト = 8x ビットであり、「通常の」整数 (int32) には 32 ビット (4 バイト) が含まれることは誰もが知っていることです。>> 演算子を使用してビットを右にシフトできます (>> 演算子は値を変更しません)。

int intValue = 566;

byte[] bytes = new byte[4];

bytes[0] = (byte)(intValue >> 24);
bytes[1] = (byte)(intValue >> 16);
bytes[2] = (byte)(intValue >> 8);
bytes[3] = (byte)intValue;

Console.WriteLine("{0} breaks down to : {1} {2} {3} {4}",
    intValue, bytes[0], bytes[1], bytes[2], bytes[3]);
于 2009-08-23T16:40:39.503 に答える
27

BitConverter.GetBytes(int)エンディアンが間違っていることを除いて、ほとんどあなたが望むことをします。

Jon Skeet のEndianBitConverter クラスを使用する前に、 IPAddress.HostToNetworkメソッドを使用して整数値内のバイトを交換することができます。どちらの方法も、移植性に関して正しいことを行います。BitConverter.GetBytes

int value;
byte[] bytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(value));
于 2009-08-23T16:33:08.567 に答える
3

この説明を見ると、この xdr 整数は単なるビッグエンディアンの「標準」整数であると感じますが、最も難読化された方法で表現されています。2 の補数表記は U2 としてよく知られています。これは、今日のプロセッサで使用されているものです。バイトオーダーは、ビッグエンディアン表記であることを示しています。
したがって、質問に答えると、配列内の要素を逆にする必要があります (0 <--> 3, 1 <-->2)。これらはリトルエンディアンでエンコードされているためです。念のため、最初BitConverter.IsLittleEndianに実行しているマシンを確認する必要があります。

于 2009-08-23T16:35:08.377 に答える
2

2 の補数を含む数値を表すさまざまな方法に関する一般的な情報が必要な場合は、以下を参照してください。

ウィキペディアの 2 の補数符号付き数の表現

于 2009-08-23T16:39:10.787 に答える