首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C中将10位无符号字节数组转换为uint16字节数组?

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

Stack Overflow用户
提问于 2020-07-08 22:14:49
回答 1查看 60关注 0票数 0

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

它们是连续放入的,比如第一个字节是9-2,第二个字节是1:0。其中9为MSB位,0为LSB。如何将它们转换成16位数组?

例如: Store like 8 bit:

代码语言:javascript
复制
0b10000011,
0b10101100,
0b10011001,
0b11000000,
0b10101000,

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

代码语言:javascript
复制
0b1000001110,
0b1011001001,
0b1001110000,
0b0010101000,
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-08 22:20:11

您似乎想要像这样转换数据

代码语言:javascript
复制
img[0] = AAAAAAAA
img[1] = AABBBBBB
img[2] = BBBBCCCC
img[3] = CCCCCCDD
img[4] = DDDDDDDD

对于像这样的数据:

代码语言:javascript
复制
array[0] = 000000AAAAAAAAAA
array[1] = 000000BBBBBBBBBB
array[2] = 000000CCCCCCCCCC
array[3] = 000000DDDDDDDDDD

可以这样做:

代码语言:javascript
复制
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 loop非常有用,如下所示:

代码语言:javascript
复制
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中添加填充,这样在使用这个循环来结束图像时不会读取超出范围的内容)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62796848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档