1

我需要能够将两个 ASCII 字节打包成一个 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 位,然后使用按位或将其与第二个字节组合。

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[]包括ushort. 您可以使用BitConverter.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 回答