说我有一个带二进制值的ASCII字符的无符号字符数组:
00001100 00011100 00110100 00111000 00110100 00100100 00010010 00011100 00100100 00010000 00011011 00001110 00001010 00011101 00100101
我不需要每个字节的两个最高有效位(即,我只需要每个字节的6个最低有效位):
--001100 --011100 --110100 --111000 --110100 --100100 --010010 --011100 --100100 --010000 --011011 --001110 --001010 --011101 --100101
我正试图通过将数组中下一个元素的最低有效位放在前一个元素的其余位中,将这些位打包到单个无符号字符数组中。最终结果应如下所示:
00001100 01000111 11100011 00110100 00101001 01110001 00100100 10110100 00111001 01001010 01010111 00000010
希望您能看到图案。
我目前正在尝试使用嵌套的for循环实现此功能,但无法获得正确的结果:
void pack(unsigned char *message)
{
unsigned char mask[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
unsigned char packed_bits[MAX_PACK_SIZE];
int i, j, k, l, m;
int count = 0;
// initialize packed bits
for (k = 0; k < MAX_PACK_SIZE; k++)
packed_bits[k] = 0;
// loop through message array
for (i = 0; i < MAX_UNPACK_SIZE; i++)
{
// loop through message[i]'s bits
for (j = 0; j < 8; j++)
{
j = count;
if (count == 6 && j == 6)
{
packed_bits[i] += (message[i + 1] & mask[0]) & mask[j + 0];
packed_bits[i] += (message[i + 1] & mask[1]) & mask[j + 1];
count = 2;
break;
}
else if (count == 6 && j == 4)
{
packed_bits[i] += (message[i + 1] & mask[0]) & mask[j + 0];
packed_bits[i] += (message[i + 1] & mask[1]) & mask[j + 1];
packed_bits[i] += (message[i + 1] & mask[2]) & mask[j + 2];
packed_bits[i] += (message[i + 1] & mask[3]) & mask[j + 3];
count = 4;
break;
}
else if (count == 6 && j == 2)
{
packed_bits[i] += (message[i + 1] & mask[0]) & mask[j + 0];
packed_bits[i] += (message[i + 1] & mask[1]) & mask[j + 1];
packed_bits[i] += (message[i + 1] & mask[2]) & mask[j + 2];
packed_bits[i] += (message[i + 1] & mask[3]) & mask[j + 3];
packed_bits[i] += (message[i + 1] & mask[4]) & mask[j + 4];
packed_bits[i] += (message[i + 1] & mask[5]) & mask[j + 5];
count = 0;
++i;
break;
}
else
{
packed_bits[i] += message[i] & mask[j];
count++;
}
}
}
for (m = 0; m < MAX_PACK_SIZE; m++)
{
printf("packed_bits[%d]=%d\n", m, packed_bits[m]);
}
}
对于OP的问题,通过一点点手动循环展开,所有一点点的摆弄变得更容易掌握。
有多种方法可以执行此操作。这是应该易于理解的一种。 (它使用GCC扩展名,二进制文字来提供示例数据。)