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 的两个连续字节配对,然后将其解包为ij。将j 向左移动一个字节并将ori 一起移动,有效地交换字节(即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

从字节数组加载 uint8x16_t 的对齐要求?

从 Keil 中的 uint8_t 数组获取 uint16_t 值

将 Intrinsic xmm 寄存器转换为 uint8_t 数组[16]

将指向 uint16_t 的指针传递给需要 C 中 uint8_t[] 数组的子例程 - 如何?

memcpy与大小端