复制期间的字节交换

2024-04-20

我需要有效地交换数组的字节顺序during复制到另一个数组中。

源数组是某种类型; char、short 或 int,因此所需的字节交换是明确的,并且将根据该类型进行。

我的计划是通过多遍字节复制(short 为 2,int 为 4,...)来非常简单地完成此操作。但是是否有任何预先存在的“memcpy_swap_16/32/64”函数或库?也许在图像处理中进行BGR/RGB图像处理。

EDIT

我知道如何交换各个值的字节,这不是问题。我想在复制期间执行此过程无论如何我都会表演.

例如,如果我有一个数组或小端 4 字节整数,我可以通过执行 4 个字节复制(初始偏移量为 0、1、2 和 3,步长为 4)来交换它们。但可能有更好的方法,也许甚至单独读取每个 4 字节整数并使用字节交换内在函数 _byteswap_ushort、_byteswap_ulong 和 _byteswap_uint64 会更快。但我怀疑一定有现有的函数可以进行这种类型的处理。

EDIT 2

刚刚发现这个,这可能是 SSE 的有用基础,尽管内存带宽确实可能会浪费时间。

从 RGB 到 BGRA 的快速矢量化转换 https://stackoverflow.com/questions/7194452/fast-vectorized-conversion-from-rgb-to-bgra


Unix系统有一个swab函数可以为 16 位数组执行您想要的操作。它可能已经优化,但我不确定。请注意,如果您只编写简单的字节交换代码,现代 gcc 将生成极其高效的代码:

uint32_t x, y;
y = (x<<24) | (x<<8 & 0xff0000) | (x>>8 & 0xff00) | (x>>24);

即它将使用bswapi486+ 上的指令。想必将其放入循环中也会给出一个有效的循环......

Edit:对于您的复制任务,我将在您的循环中执行以下操作:

  1. 从中读取 32 位值const uint32_t *src.
  2. 使用上面的代码来交换它。
  3. 将 32 位值写入uint32_t *dest.

严格来说,这可能不可移植(别名违规),但只要复制函数位于其自己的翻译单元中并且不被内联,就无需担心。 忘记我写的关于别名的内容;如果您将数据交换为 32 位值,几乎可以肯定它实际上是 32 位值,而不是转换的其他类型的指针,因此没有问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

复制期间的字节交换 的相关文章

随机推荐