可以安全地反转Double的字节顺序吗?

时间:2019-05-16 11:06:46

标签: swift double endianness

Double在内存中使用8个字节表示。 我相信这8个字节应该包含两个部分,每个部分用于整数部分,一个部分用于小数部分(如果我在此假设中错了,请纠正我)。 我的机器有点小尾声(现在每个Macmini都是)。我想将代表Double的这8个字节传输到一个文件,该文件应在BigEndian平台(尤其是JVM)上可读。

对于普通整数来说,反转字节顺序是安全的,因为它们没有成分并且是原子的。

考虑到Double具有两个组成部分,简单地反转其字节顺序是否安全?如果不安全,该如何将LittleEndian数据表示为BidEndian数据?

我还需要读取一个包含BigEndian数据的文件,并将其转换为LittleEndian机器上的Double。恰好相反。

1 个答案:

答案 0 :(得分:1)

有一种bitPattern方法可将浮点值的位模式获取为整数,还有一种Double(bitPattern:)初始化程序可用于反向转换。从文档中:

  

位模式与IEEE 754规范定义的二进制交换格式匹配。

因此-假设JVM使用相同的IEEE 754二进制交换格式-以下内容将是安全的:

let x = 12.34

// Double to binary interchange format (big endian):
let data = withUnsafeBytes(of: x.bitPattern.bigEndian) { Data($0) }

反方向:

// Binary interchange format (big endian) to Double:
let y = data.withUnsafeBytes { Double(bitPattern: UInt64(bigEndian: $0.load(as: UInt64.self))) }