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

Posted

技术标签:

【中文标题】Double 的字节顺序可以安全地反转吗?【英文标题】:Can the byte order of Double be safely reversed? 【发布时间】:2019-05-16 11:06:46 【问题描述】:

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

普通整数颠倒字节顺序是安全的,因为它们没有组件并且是原子的。

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

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

【问题讨论】:

【参考方案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))) 

【讨论】:

以上是关于Double 的字节顺序可以安全地反转吗?的主要内容,如果未能解决你的问题,请参考以下文章

改变字节顺序的最快方法

工会中的char字节是否被反转?

字节顺序测试:为啥以下代码有效?

在 64 位机器上,我可以安全地并行处理 64 位四字的各个字节吗?

short int 到 unsigned int 转换网络字节顺序 C++

Java的Class字节码文件是二进制的吗?