uint8 小端数组到 uint16 大端
Posted
技术标签:
【中文标题】uint8 小端数组到 uint16 大端【英文标题】:uint8 little endian array to uint16 big endian 【发布时间】:2018-06-25 18:54:21 【问题描述】:在 Python2.7 中,我通过 USB 批量传输从相机获取图像帧:
frame = dev.read(0x81, 0x2B6B0, 1000)
我知道一帧是 342x260 = 88920 像素 little endian,因为我从批量传输中读取了 2x88920 = 177840 (0x2B6B0)。
如何将typecode=B的frame数组的内容转换成uint16 big endian数组?
【问题讨论】:
【参考方案1】:这样的事情应该可以解决问题:
frame_short_swapped = array.array('H', ((j << 8) | i
for (i,j)
in zip(frame[::2], frame[1::2])))
它将来自frame
的两个连续字节配对,然后将其解包为i
和j
。将j
向左移动一个字节并将or
与i
一起移动,有效地交换字节(即2 字节类型的字节序转换)并将其输入H
类型数组。我对此有点不安,因为它应该对应于 C short
类型(根据文档),但类型大小实际上只能保证最小长度。我猜你需要介绍ctypes.c_uint16
,如果严格的话?
【讨论】:
不错,这似乎可行,用 x = [3,103,3,103] 进行的小测试将其转换为 array('H', [26371, 26371]),这正是我想要的。我将很快用我的相机数据对其进行测试。抱歉,我的英语不好,但你的最后一句话是说我应该使用 ctypes.c_uint16 作为 frame_short_swapped?我也可以使用 numpy.uint16 数组吗? 我的意思是,如果您严格要求uint16
,类型代码H
(或short
)并不能保证这一点。如果您依赖它/这是一个问题,那么您将不得不更进一步并使用其他东西来处理和存储您的值。比如ctypes
,或者,是的,numpy
。
哦,对不起,我应该添加。不能保证short
(仅)2 个字节长,但实际上很有可能并且在您遇到的大多数系统上很有可能。 :) 换句话说,根据您的用例,请记住这一点,但可能不需要采取任何措施(至少目前是这样)。以上是关于uint8 小端数组到 uint16 大端的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中将两个字节的 UInt8 数组转换为 UInt16
从 Keil 中的 uint8_t 数组获取 uint16_t 值
将 Intrinsic xmm 寄存器转换为 uint8_t 数组[16]