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

标签 swift double endianness

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

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

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

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

最佳答案

有一个bitPattern将浮点值的位模式作为整数获取的方法,以及 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($0) }

对于相反的方向:

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

关于swift - Double 的字节顺序可以安全地反转吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56167127/

相关文章:

swift - Swift 中的视频合并方向

c++ - 原始数据包创建导致 IP 字段顺序不正确

c - uint32_t 和 uint8_t[4] 的 C union 会在小端架构上始终以相同的方式映射吗?

c - 为什么字节顺序(endianess)对于标准 C 字符串来说不是问题?

ios - 预加载 UIWebView

ios - Fabric crashlytics 显示最新 iOS 应用程序版本 UUID 缺少 .dSYM 文件

ios - Swift Alamofire回调导致数据库多线程访问报错

Java - 数量很少的可比接口(interface)

swift - 为什么我不能在 Swift 中对 double 元组使用 min()?

c++ - 四舍五入到小数点后两位