如何在C中将10位无符号字节数组转换为uint16字节数组?

时间:2020-07-08 14:14:48

标签: c

我有一个二进制格式的img。 每个像素为10位。

它们被连续推入,就像第一个字节中的[9-2]和第二个字节中的[1:0]。 其中9 IS MSB位,0-LSB。 如何将它们转换为16bit数组?

例如: 像8位一样存储:

0b10000011,
0b10101100,
0b10011001,
0b11000000,
0b10101000,

包含实际像素的实际数据,我想将其转换为16位:

0b1000001110,
0b1011001001,
0b1001110000,
0b0010101000,

1 个答案:

答案 0 :(得分:2)

似乎您想像这样转换数据

img[0] = AAAAAAAA
img[1] = AABBBBBB
img[2] = BBBBCCCC
img[3] = CCCCCCDD
img[4] = DDDDDDDD

对这样的数据:

array[0] = 000000AAAAAAAAAA
array[1] = 000000BBBBBBBBBB
array[2] = 000000CCCCCCCCCC
array[3] = 000000DDDDDDDDDD

可以这样做:

array[0] = ((img[0] << 2) | (img[1] >> 6)) & 0x3ff;
array[1] = ((img[1] << 4) | (img[2] >> 4)) & 0x3ff;
array[2] = ((img[2] << 6) | (img[3] >> 2)) & 0x3ff;
array[3] = ((img[3] << 8) |  img[4]      ) & 0x3ff;

要转换多个块,for循环很有用,如下所示:

for (int i = 0; (i + 1) * 5 <= num_of_bytes_in_img; i++) {
    array[i * 4 + 0] = ((img[i * 5 + 0] << 2) | (img[i * 5 + 1] >> 6)) & 0x3ff;
    array[i * 4 + 1] = ((img[i * 5 + 1] << 4) | (img[i * 5 + 2] >> 4)) & 0x3ff;
    array[i * 4 + 2] = ((img[i * 5 + 2] << 6) | (img[i * 5 + 3] >> 2)) & 0x3ff;
    array[i * 4 + 3] = ((img[i * 5 + 3] << 8) |  img[i * 5 + 4]      ) & 0x3ff;
}

(此循环不会转换最后几个字节,因此您应单独对待它们或在使用img结束图像时在img上添加填充,以免超出范围)