2013-10-20 39 views
-2

我已經嘗試了幾個小時來弄清楚如何操縱一個字節數組來做「拆包」和用C#打包。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第一)。

如何實現此轉換?

+3

我覺得你的問題停止了一半... –

+0

該規範和示例來自http://www.scribd.com/doc/54261730/Prophet-08-Manual-v1-3#page=60並且不似乎沒有提供比問題更多的細節。所以我想它需要一些獨創性來弄清楚如何實現這種轉換。 – dtb

+1

我想我明白了:行表示一個字節,行中的每個位置都有一位。值中的字母實際上是解壓縮序列中字節的數量/位置(排序),其中A =第1個字節,B =第2個字節等等。字母后面的數字是字節中的實際位在指示的位置上。這是我的猜測,我不確定,因此沒有答案。 – elgonzo

回答

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 

正如你所看到的,在本例中輸入的每個字節的最高位顯著被清除,和前綴字節添加每個輸入字節的最高有效位。