1

2 つの ASCII バイトを 1 つの ushort にパックできるようにする必要があります。どうすればこれを達成できますか?

これまでのところ、私は持っています:

for (var i = 0; i < asciiBytes.Length; i += 2)
{
    // Get two bytes from an ASCII byte array.
    var sub = new[] { asciiBytes[i], asciiBytes[i + 1] }; 

    // Pack the two bytes into a ushort
    // ????????
}
4

2 に答える 2

9

左シフト演算子を使用して最初のバイトを 8 ビット左にシフトし、ビットごとのORを使用してそれを 2 番目のバイトと組み合わせることができます。

ushort x = (ushort)((asciiBytes[i] << 8) | asciiBytes[i + 1]);

これは、算術的には次のものと同等です (ただし、より効率的です)。

ushort x = (ushort)(asciiBytes[i] * 256 + asciiBytes[i + 1]);

編集:逆の操作は次のとおりです。

byte b1 = (byte)(x >> 8);
byte b2 = (byte)(x & 255);
于 2013-07-09T17:59:37.260 に答える
2

BitConverter クラスbyte[]は、 を含む多くの標準型との間で変換を行うためのメソッドを提供しますushortBitConverter.ToUInt16を使用して、これを直接処理できます。

ushort value = BitConverter.ToUInt16(asciiBytes, i); // Can pass the index directly

// To "unpack":
byte[] bytes = BitConverter.GetBytes(value);

これは、 BitConverter.IsLittleEndianによって決定できるシステムのバイト順を使用することに注意してください。

于 2013-07-09T18:17:12.923 に答える