-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

各行は 1 バイトを示し、各列は 1 ビット (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 に答える