2013-08-21 63 views
0

我想執行格雷編碼/上的easurement,其被存儲在字符數組解碼訪問一系列連續的12個比特。因此,我需要訪問傳遞給編碼器/解碼器的連續12位測量值。C:在字符數組

char數組是22字節長並且看起來像這樣,例如:

unsigned char measurement1[22] = 
{0xb5, 0x31, 0xc6, 0x51, 0x84, 0x26, 0x2c, 0x69, 0xfd, 0x9e, 
0xef, 0xd4, 0xcf, 0xf1, 0x24, 0xd4, 0xf1, 0x97, 0xe5, 0x81, 
0x02, 0xf8} 

此刻,我char數組變換成相應的比特的陣列,並且它傳遞給編碼器。然而,這種方法相當耗費內存,因爲位數組也是一個字符數組(0或1),總共有176個字節(22 * 8)。

是否有一個更節省存儲器的方法,其不依賴於字節數組轉換爲一系列的位,而是訪問12個連續的比特,並將它們傳遞到解碼器?

最好的問候, P.

+0

你是什麼意思的「記憶保存方法」?如上所述的打包陣列是最節省內存的方法。如果你想提取每個12位數據值來做一些操作,就像下面的Jongware一樣。如果我不知道下一個階段 –

+0

的輸入,那麼我無法回答任何問題,哪12位要訪問? –

回答

0

未經檢驗的,從我的頭頂,我敢肯定,你可以進一步簡化它...

int i = 0, left = 8, v = 0; 

do 
{ 
    v = 0; 
    switch (left) 
    { 
    case 8: 
    { 
     v = measurement1[i++]; 
     v = (v << 4) | (measurement1[i] >> 4); // please handle end here correctly 
     left = 4; 
     break; 
    } 
    case 4: 
    { 
     v = measurement1[i++] & 0x0F; // lower nibble 
     v = (v << 8) | measurement1[i++]; // please handle end here correctly 
     left = 8; 
     break; 
    } 
    } 
    // Now encode v 
} while (i < 22); 
2

轉換的指數i沒有一個1基於字節的偏移量爲8位,而是基於12位偏移量。那就要看你是否索引偶數或奇數12位三重:

for (i=0; i<22*8/12; i++) 
{ 
    printf ("%03x ", (i & 1) ? measurement1[3*i/2+1]+((measurement1[3*i/2] & 0x0f)<<8) : (measurement1[3*i/2]<<4)+((measurement1[3*i/2+1]>>4) & 0x0f)); 
} 

這裏假設你的測量陣列的讀左到右,即

0xb5, 0x31, 0xc6 

轉化爲

0xb53 0x1c6 

如果您的訂單是不同的,你需要調整位移位。

請問您的測量陣列是否有而不是包含12位的倍數?

+0

不要假設char是8位寬,使用CHAR_BIT – maep

+0

@maep:'char'的實際寬度在這裏並不重要。該數組以'unsigned char'形式給出,僅包含8位值。對這些字符進行的唯一操作是位移和掩碼 - 沒有任何措施可以防止它與「9位字符」甚至短語或整數完全一樣。 – usr2564301

-1

你可以「解析」的mesurement作爲一個12位的數組:

typedef union { // you can use union or struct here 
    uint16_t i : 12; 
} __attribute__((packed)) uint12_t; 
printf("%u", ((uint12_t*) mesurement)[0]); 

這將打印您陣列的前12位。

+1

由於使用錯誤的printf格式說明符並使用保留名稱'uintN_t',並違反了嚴格的別名規則,導致未定義的行爲。位字段的佈局也是實現定義的 –