Double
在内存中使用8个字节表示。
我相信这8个字节应该包含两个部分,每个部分用于整数部分,一个部分用于小数部分(如果我在此假设中错了,请纠正我)。
我的机器有点小尾声(现在每个Macmini都是)。我想将代表Double
的这8个字节传输到一个文件,该文件应在BigEndian平台(尤其是JVM)上可读。
对于普通整数来说,反转字节顺序是安全的,因为它们没有成分并且是原子的。
考虑到Double
具有两个组成部分,简单地反转其字节顺序是否安全?如果不安全,该如何将LittleEndian数据表示为BidEndian数据?
我还需要读取一个包含BigEndian数据的文件,并将其转换为LittleEndian机器上的Double
。恰好相反。
答案 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))) }