我需要能够将两个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
// ????????
}
答案 0 :(得分:9)
您可以使用left-shift operator将第一个字节向左移8位,然后使用bitwise OR将其与第二个字节合并。
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);
答案 1 :(得分:2)
BitConverter class提供了从byte[]
转换为多种标准类型的方法,包括ushort
。您可以使用BitConverter.ToUInt16直接处理此问题。
ushort value = BitConverter.ToUInt16(asciiBytes, i); // Can pass the index directly
// To "unpack":
byte[] bytes = BitConverter.GetBytes(value);
请注意,这使用系统的字节顺序,可以由BitConverter.IsLittleEndian确定。