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

如何在C语言中将10位无符号字节数组转换为uint16字节数组?,c,C,我有一个二进制格式的img。 每个像素是10位 它们是连续放置的,就像第一个字节中的[9-2]和第二个字节中的[1:0]一样。 其中9为MSB位,0为LSB。 如何将它们转换为16位数组 例如: 像8位那样存储: 0b10000011, 0b10101100, 0b10011001, 0b11000000, 0b10101000, 包含真实像素且我希望转换为16位的实际数据: 0b1000001110, 0b1011001001, 0b1001110000, 0b0010101000, 看起

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

它们是连续放置的,就像第一个字节中的[9-2]和第二个字节中的[1:0]一样。 其中9为MSB位,0为LSB。 如何将它们转换为16位数组

例如: 像8位那样存储:

0b10000011,
0b10101100,
0b10011001,
0b11000000,
0b10101000,
包含真实像素且我希望转换为16位的实际数据:

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

看起来您想要像这样转换数据

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 (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;
}
可以这样做:

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 (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;
}
array[0]=((img[0]>6))&0x3ff;
数组[1]=((img[1]>4))&0x3ff;
数组[2]=((img[2]>2))&0x3ff;
数组[3]=((img[3]4))&0x3ff;
数组[i*4+2]=((img[i*5+2]>2))&0x3ff;

数组[i*4+3]=((img[i*5+3]似乎您想要像这样转换数据

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 (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;
}
可以这样做:

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 (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;
}
array[0]=((img[0]>6))&0x3ff;
数组[1]=((img[1]>4))&0x3ff;
数组[2]=((img[2]>2))&0x3ff;
数组[3]=((img[3]4))&0x3ff;
数组[i*4+2]=((img[i*5+2]>2))&0x3ff;

数组[i*4+3]=((img[i*5+3]1.从输入[0]中提取位号10-2,放入输出[0]。2.从输入[1]中提取位号2-1,放入输出[1]中的位号8-7。3.从输入[2]中提取位号10-4,放入输出[1]中的位号6-1)等。等等。你尝试过什么?你到底有什么问题?我有优化问题,我需要尽快解决。可能需要存储一些表或类似的内容。你需要在问题中指定。请发布你的尝试。什么优化问题?你使用什么体系结构?什么编译器、编译器版本和选项e使用?您对便携式解决方案感兴趣吗?GNU扩展是否可行?您做了哪些研究?您的研究结果是什么?为什么不令人满意?指定这些内容将允许其他人适当地回答您。1.从输入[0]中提取位号10-2并放入输出[0]。2.从输入[1]中提取位号2-1并将其置于输出[1]的位位置8-7处。3.从输入[2]中提取位号10-4,并置于输出[1]的位位置6-1处等。等等。你尝试过什么?你到底有什么问题?我有优化问题,我需要尽快解决。可能需要存储一些表或类似的内容。你需要在问题中指定。请发布你的尝试。什么优化问题?你使用什么体系结构?什么编译器、编译器版本和选项e使用?您对便携式解决方案感兴趣吗?GNU扩展可以吗?您做了哪些研究?您的研究结果是什么?为什么不令人满意?指定这些内容将允许其他人适当地回答您。谢谢!通过存储在表e中,可以更快地完成吗。g@delkov:可能不会。您需要四个表,以t为索引两个字节的组合用于从字节序列中选择像素0..3(因此
表0
将被
索引)(字节0谢谢!通过存储在表e中可以更快地完成吗。g@delkov:可能不是。您需要四个表,它们由两个字节的组合索引,以便从字节序列中选择像素0..3(因此
表0
将被
(字节0)索引