12

バイト配列を持つコントロールがあります。

ときどき、配列内の将来の項目数に関する情報を伝える 2 バイトがあります。

例として、私が持つことができる:

...
...
アイテム[4] = 7
項目[5] = 0
...
...

この値は明らかに 7 です。

しかし、これはどうですか?

...
...
項目[4] = 0
項目[5] = 7
...
...

それが(通常のintとして)何に相当するかについて何か考えはありますか?

私はバイナリに行き、1792 に等しい 11100000000 かもしれないと考えました。

テストせずにこれを知る方法はありますか?

注: C# 3.0 と Visual Studio 2008 を使用しています

4

6 に答える 6

23

BitConverter2 バイトを 2 バイト整数値に簡単に変換できます。

// assumes byte[] Item = someObject.GetBytes():
short num = BitConverter.ToInt16(Item, 4); // makes a short 
    // out of Item[4] and Item[5]
于 2010-04-18T00:48:18.830 に答える
16

2 バイトの数値には、下位バイトと上位バイトがあります。上位バイトは下位バイトの 256 倍の価値があります。

value = 256 * high + low;

したがって、high=0 と low=7 の場合、値は 7 になります。ただし、high=7 と low=0 の場合、値は 1792 になります。

もちろん、これは数値が単純な 16 ビット整数であることを前提としています。それがもっと凝ったものであれば、上記は十分ではありません。次に、数値をデコードするために、数値がどのようにエンコードされているかについてさらに知識が必要です。

上位バイトと下位バイトが表示される順序は、バイト ストリームのエンディアンによって決まります。ビッグ エンディアンでは、(より低いアドレスで) ローの前にハイが表示されますが、リトル エンディアンでは逆です。

于 2010-04-17T22:07:10.693 に答える
8

「この値は明らかに7です」と言いますが、それは完全にエンコーディングに依存します。全幅バイトを想定すると、リトルエンディアンではそうです。7、0は7です。しかし、ビッグエンディアンではそうではありません。

リトルエンディアンの場合、必要なのは

int i = byte[i] | (byte[i+1] << 8);

ビッグエンディアンの場合:

int i = (byte[i] << 8) | byte[i+1];

ただし、他のエンコーディングスキームも利用できます。たとえば、一部のスキームでは7ビット演算を使用し、8番目のビットを継続ビットとして使用します。一部のスキーム(UTF-8)は、すべての継続ビットを最初のバイトに配置し(したがって、最初のバイトにはデータビット用のスペースが限られています)、残りのビットには8ビットをシーケンスに配置します。

于 2010-04-17T22:35:05.270 に答える
2

これらの 2 バイトを単純に 2 進数形式で並べて配置し、その大きな数が 10 進数で表示されるようにしたい場合は、次のコードを使用する必要があります。

if (BitConverter.IsLittleEndian)
{
    byte[] tempByteArray = new byte[2] { Item[5], Item[4] };
    ushort num = BitConverter.ToUInt16(tempByteArray, 0);
}
else
{
    ushort num = BitConverter.ToUInt16(Item, 4);
}

受け入れられた回答に見られるように使用する場合short num = BitConverter.ToInt16(Item, 4);、これらの 2 バイトの最初のビットが符号ビット (1 = 負および 0 = 正) であると想定しています。その答えは、ビッグエンディアンシステムを使用していることも前提としています。符号ビットの詳細については、これを参照してください。

于 2015-03-04T06:11:33.037 に答える
0

それらのバイトが整数の「部分」である場合、そのように機能します。ただし、バイトの順序はプラットフォーム固有であり、整数の長さにも依存することに注意してください (16 ビット = 2 バイト、32 ビット = 4 バイトなど)。

于 2010-04-17T22:07:17.060 に答える
0

項目[5]がMSBの場合

  1. ushort 結果 = BitConverter.ToUInt16(新しいバイト [2] {アイテム [5]、アイテム [4] }、0);

  2. int 結果 = 256 * アイテム [5] + アイテム [4];

于 2017-12-14T14:48:49.447 に答える