交换双字节的字节顺序

时间:2012-10-04 01:16:17

标签: objective-c cocoa floating-point core-foundation endianness

我正在读取可能由Big Endian字节顺序中的64位浮点数(“双精度”)组成的二进制数据。我使用NSData的getBytes:range:方法将它们单独读入Float64类型的缓冲区。现在我想将字节顺序更改为Little Endian。对于整数,使用Core-Foundation函数CFSwapIntXX()很容易实现,其中XX是位数。但浮动没有相应的方法。这样做的首选方法是什么?

我尝试通过先前将其存储到int64_t变量然后再次返回到double值来“强制”64位double作为函数CFSwapInt64()的参数。它工作正常,但这对我来说似乎相当野蛮。标准框架没有附带方法吗?

1 个答案:

答案 0 :(得分:1)

对浮点数的直接支持使用与平台无关的格式,请参阅Byte Order Utilities。但是你的方式很好,交换函数中的“整数”是不相关的 - 无论这些字节如何被解释,函数都会在很多字节上运行。

为避免丑陋的字节副本,您可以使用union

typedef union { Float64 floatValue; int64_t intValue; } FloatBuffer;

填写此字节并使用intValue字段进行字节交换,并使用floatValue字段读取值。