Double 的字节顺序可以安全地反转吗?
Can the byte order of Double be safely reversed?
Double
在内存中使用 8 个字节表示。
我相信这 8 个字节应该有两个部分,一个用于整数部分,一个用于小数部分(如果我在这个假设中有误,请纠正我)。
我的机器是小端(现在每个 Macmini 都是)。我想将代表 Double
的这 8 个字节传输到一个文件,该文件应该在 BigEndian 平台(特别是 JVM,即 BE)上可读。
普通整数颠倒字节顺序是安全的,因为它们没有组件并且是原子的。
考虑到 Double
有两个组成部分,简单地颠倒字节顺序是否安全?如果它不安全,我该如何将 LittleEndian 数据表示为 BidEndian 数据?
我还需要读取一个包含 BigEndian 数据的文件并在我的 LittleEndian 机器上将其转换为 Double
。完全相反的情况。
有一个 bitPattern
method to get the bit pattern of a floating point value as an integer, and a Double(bitPattern:)
用于反向转换的初始值设定项。来自文档:
The bit pattern matches the binary interchange format defined by the IEEE 754 specification.
因此——假设 JVM 使用相同的 IEEE 754 二进制交换格式——以下是安全的:
let x = 12.34
// Double to binary interchange format (big endian):
let data = withUnsafeBytes(of: x.bitPattern.bigEndian) { Data([=10=]) }
反方向:
// Binary interchange format (big endian) to Double:
let y = data.withUnsafeBytes { Double(bitPattern: UInt64(bigEndian: [=11=].load(as: UInt64.self))) }
Double
在内存中使用 8 个字节表示。
我相信这 8 个字节应该有两个部分,一个用于整数部分,一个用于小数部分(如果我在这个假设中有误,请纠正我)。
我的机器是小端(现在每个 Macmini 都是)。我想将代表 Double
的这 8 个字节传输到一个文件,该文件应该在 BigEndian 平台(特别是 JVM,即 BE)上可读。
普通整数颠倒字节顺序是安全的,因为它们没有组件并且是原子的。
考虑到 Double
有两个组成部分,简单地颠倒字节顺序是否安全?如果它不安全,我该如何将 LittleEndian 数据表示为 BidEndian 数据?
我还需要读取一个包含 BigEndian 数据的文件并在我的 LittleEndian 机器上将其转换为 Double
。完全相反的情况。
有一个 bitPattern
method to get the bit pattern of a floating point value as an integer, and a Double(bitPattern:)
用于反向转换的初始值设定项。来自文档:
The bit pattern matches the binary interchange format defined by the IEEE 754 specification.
因此——假设 JVM 使用相同的 IEEE 754 二进制交换格式——以下是安全的:
let x = 12.34
// Double to binary interchange format (big endian):
let data = withUnsafeBytes(of: x.bitPattern.bigEndian) { Data([=10=]) }
反方向:
// Binary interchange format (big endian) to Double:
let y = data.withUnsafeBytes { Double(bitPattern: UInt64(bigEndian: [=11=].load(as: UInt64.self))) }