-1

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

打包数据格式

数据打包成 8 个字节的“数据包”,MS 位从 7 个参数字节中剥​​离,并打包成第 8 个字节,在 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 在前)。

如何实现这种转换?

4

1 回答 1

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

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

于 2013-10-21T00:23:32.537 回答