在Swift中将字节数组转换为double

时间:2015-08-02 15:23:25

标签: swift casting type-conversion

如何在Swift中将字节数组转换为double值?

(它是NSInputStream扩展名)

我的代码段位于下方,但未返回正确的双倍值:

func readDouble() -> Double
{
var readBuffer = Array<UInt8>(count:sizeof(Double), repeatedValue: 0)

        let numberOfBytesRead = self.read(&readBuffer, maxLength: readBuffer.count)
        let help1 = Int(readBuffer[0] & 0xff) << 56 | Int(readBuffer[1] & 0xff) << 48
        let help2 = Int(readBuffer[2] & 0xff) << 40 | Int(readBuffer[3] & 0xff) << 32
        let help3 = Int(readBuffer[4] & 0xff) << 24 | Int(readBuffer[5] & 0xff) << 16
        let help4 = (Int(readBuffer[6] & 0xff) << 8) | Int(readBuffer[7] & 0xff)
        return Double(help1 | help2 | help3 | help4)
}

2 个答案:

答案 0 :(得分:0)

我的理解是你的字节数组是二进制表示的序列化。但是,您使用的Double构造函数采用整数值并返回相应的DoubleDouble(3)会返回3.0

正确的构造函数可能是Double(_bits:),但它接受Builtin.FPIEEE64,看起来它的可用性是一个实现细节。您应该考虑创建一个C函数并将其桥接到Swift。

答案 1 :(得分:0)

这很简单:

extension FloatingPoint {

    init?(_ bytes: [UInt8]) {

        guard bytes.count == MemoryLayout<Self>.size else { return nil }

        self = bytes.withUnsafeBytes {

            return $0.load(fromByteOffset: 0, as: Self.self)
        }
    }
}

let array: [UInt8] =  [0, 0, 0, 0, 0, 0, 240, 63]
let num = Double(array) // 1.0

此代码适用于Swift中的任何浮点类型。

macOS上的Swift 3.0 little-endian 表示Double

您可以查找我的备忘单以进行字节转换here。 (小/大端数转换)