主机 machine/device 的字节顺序是什么?

What is the endian order of the host machine/device?

实际上最初的问题是:“kCGBitmapByteOrderDefault 到底是什么?”因为有时 CGImageGetByteOrderInfo(CGImageRef image) returns kCGBitmapByteOrderDefault 作为结果。但这只是告诉它等于主机的字节顺序 machine/device.

然后问题自动变为:“主机 machine/device 的字节序是什么?”

A​​pple 文档告诉我们有几个常量可以作为确切答案:

kCGImageByteOrder16Big
kCGImageByteOrder16Little
kCGImageByteOrder32Big
kCGImageByteOrder32Little

所以,我需要 returns 上面列表中的一些值的解决方案。

你说:

Because sometimes CGImageGetByteOrderInfo(CGImageRef image) returns kCGBitmapByteOrderDefault as a result. But this just tells that it is equal to the endian order of the host machine/device.

不是机器的字节序。这是 CoreGraphics 的默认字节顺序。请参阅 Apple 论坛上的 What does kCGBitmapByteOrderDefault actually mean?。他们指出,虽然没有记录,但 kCGBitmapByteOrderDefault 似乎采用了 big-endian 顺序。

一个人可以通过创建一个 kCGBitmapByteOrderDefault 上下文来确认这一点,另一个人可以通过 kCGBitmapByteOrder32Big 来确认这一点,并比较它们如何呈现特定颜色。在我的 little-endian 机器上,kCGBitmapByteOrderDefault 的结果与 kCGBitmapByteOrder32Big 的结果相同,而不是 kCGBitmapByteOrder32Little。这与该论坛讨论中的主张一致。

FWIW、PNG 和 JPG 使用“网络字节顺序”(即 big-endian)。此外,有一种直观的吸引力,例如,让 RGBA 图像的字节按红色、绿色、蓝色然后是 alpha 的顺序出现,而不是相反。如果 CoreGraphics 想选择一个不考虑硬件的标准来使用,big-endian 不是一个不合理的选择。我只是希望他们记录下来。


话虽如此,当我需要 access/manipulate 图像的像素缓冲区时,我总是将图像渲染到具有显式字节顺序的缓冲区,如 Apple Technical Q&A QA1509. Personally, though, I let let CoreGraphics manage the data provider for me, rather than manual malloc/free suggested by that old Technical Q&A doc. See this permutation 的 QA1509 代码中所述.