c#中的字节数组操作

时间:2013-10-20 23:06:11

标签: c# bytearray bit-manipulation

我已经花了好几个小时来弄清楚如何操作一个字节数组来进行“解包”并用C#打包。

  

打包数据格式

     

数据以8字节“数据包”打包,MS位从7中剥离   参数字节,并打包到第八个字节,在开始时发送   8字节数据包。

     

示例:

Input Data 
1 A7 A6 A5 A4 A3 A2 A1 A0
2 B7 B6 B5 B4 B3 B2 B1 B0 
3 C7 C6 C5 C4 C3 C2 C1 C0 
4 D7 D6 D5 D4 D3 D2 D1 D0 
5 E7 E6 E5 E4 E3 E2 E1 E0 
6 F7 F6 F5 F4 F3 F2 F1 F0 
7 G7 G6 G5 G4 G3 G2 G1 G0 

Packed MIDI data
1 00 G7 F7 E7 D7 C7 B7 A7
2 00 A6 A5 A4 A3 A2 A1 A0
3 00 B6 B5 B4 B3 B2 B1 B0
4 00 C6 C5 C4 C3 C2 C1 C0
5 00 D6 D5 D4 D3 D2 D1 D0
6 00 E6 E5 E4 E3 E2 E1 E0
7 00 F6 F5 F4 F3 F2 F1 F0
8 00 G6 G5 G4 G3 G2 G1 G0

每行表示一个字节,每列一位(MSB优先)。

如何实施此转化?

1 个答案:

答案 0 :(得分:0)

如果我正在阅读规范,那应该可以解决问题:

byte[] input = new byte[7] { 0x81, 0x82, 0x03, 0x84, 0x05, 0x06, 0x87 };

byte[] output = new byte[8];

for (int i = 0; i < 7; i++)
{
    output[0] |= (byte)((input[i] >> 7) << i);
    output[i + 1] = (byte)(input[i] & 0x7F);
}

// output == { 0x4b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }

// output[0] == 0b01001011

如您所见,示例中每个输入字节的最高有效位被清除,并且前缀字节与每个输入字节的最高有效位相加。