如何用c?将10位数据存储到8位数组?

时间:2012-05-26 20:59:39

标签: c algorithm

我有一些这样的数据:
0代表数据
x代表空的 0000000000xxxxxx
10比特............ 6比特浪费

我想用下一个数据压缩它以节省空间。

我使用位移来做到这一点。

| 8Bit | 2Bit 6Bit | 4Bit 4Bit | 6Bit 2Bit | 8Bit |

到目前为止,我有:

#define mask1   (char)((Data & 0xFF00) >> 8);  //apply mask
#define mask2   (char)((Data & 0x00C0) >> 6);
#define mask3   (char)((Data & 0xFC00) >> 10); 
#define mask4   (char)((Data & 0x03C0) >> 6);
#define mask5   (char)((Data & 0xF000) >> 12); 
#define mask6   (char)((Data & 0x0FC0) >> 6);
#define mask7   (char)((Data & 0xC000) >> 14); 
#define mask8   (char)((Data & 0x3FC0) >> 6);

switch (counter) {     //repeat after 4 times
    case 0:
         array[i++] = mask1;
         array[i]   = mask2;
         counter++;
         break; 

    case 1:
         array[i++]| = (mask3);
         array[i]    = (mask4);
         counter++;
         break;

    case 2:
         array[i++]| = mask5;
         array[i]    = mask6;
         counter++;
         break; 

    case 3:
         array[i++]| = mask7;
         array[i++]  = mask8;
         counter=0;
         break;
}

1 个答案:

答案 0 :(得分:2)

一种可行的方法是强制转换数组,并移动数组指针。 如果我用图表来说明,那就更好了:

oooooooooo_____
        __oooooooooo____
                ____oooooooooo__
                        ______oooooooooo
                             >>>|<<<
                                        oooooooooo______

因此,如果我们要实现上述想法,我们将获得类似于以下内容的代码:

void convert(char* array, int arraySz, tenbitData* Data, int dataSz)
{
    char* arrPtr = array;
    int dataIdx = 0;
    int rollCnt = 0;

    for (int i = 0; i < dataSz; i++)
    {
        ushort dat = dataSz[i] << 6 - ((i % 4) * 2);
        ushort* ariPtr = (ushort*) arrPtr;
        ariPtr[0] |= dat;
        arrPtr += ((i % 4) == 3 ? 2 : 1;
    }
}