我有一些这样的数据:
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;
}
答案 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;
}
}