0

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

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

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

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

到目前为止,我有:

#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;
}
4

1 回答 1

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;
    }
}
于 2020-08-03T20:42:23.117 回答