2015-08-02 4 views
0

Как преобразовать массив байтов в двойное значение в Swift?Преобразование байтового массива в double в Swift

(Это расширение 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) 
} 
+0

Каким образом представлены данные во входном потоке? Как двоичный двойной целочисленный или двоичный код IEEE? Какой порядок байтов? Какой результат вы получаете и чего вы ожидаете? –

+0

Это массив двойников, написанных в java. – AVEbrahimi

+0

Вы спрашиваете людей Swift, поэтому было бы полезно добавить информацию *, как Java пишет массив двойников. –

ответ

0

Я понимаю, что ваш массив является сериализации двоичного представления , Однако используемый вами конструктор Double принимает целочисленное значение и возвращает соответствующий Double. Double(3)3.0.

Правильный конструктор, вероятно, будет Double(_bits:), но он принимает Builtin.FPIEEE64, и похоже, что его доступность представляет собой деталь реализации. Вероятно, вам стоит подумать о создании функции C и подключить ее к Swift.

+0

Вы можете читать из входного потока непосредственно в переменную Swift 'Double', см., Например, http://stackoverflow.com/a/25846086/1187415. Но это зависит от представления данных (это то, что я все еще пытаюсь выяснить). –

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.

Swift 3,0 на MacOS (прямой порядок байтов представление Double)

Вы можете посмотреть мою шпаргалку для преобразования байт here. (преобразование числа маленьких/больших чисел)

Смежные вопросы