我已经花了好几个小时来弄清楚如何操作一个字节数组来进行“解包”并用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优先)。
如何实施此转化?
答案 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
如您所见,示例中每个输入字节的最高有效位被清除,并且前缀字节与每个输入字节的最高有效位相加。