2017-08-19 21 views
0

Double-Bigエンディアンに変換する必要があります。これは、本来IBM半二重で定義された石油産業バイナリファイル標準を使用してファイルに書き込むためです。 1970年代の9インチトラックのテープ!スウィフト4 - 効率的なDoubleからビッグエンディアンへの変換

本当に効率的なSwift 4コードが必要です。なぜなら、この変換は2つのネストループ内にあり、100,000回以上実行されるからです。

答えて

1

あなたは変換する必要があるかもしれませんファイルにそれを書くために

let value = 1.0 
var n = value.bitPattern.bigEndian 

Doubleのビッグエンディアン表現 を含むUInt64を作成することができ、それ Dataへ:

let data = Data(buffer: UnsafeBufferPointer(start: &n, count: 1)) 
print(data as NSData) // <3ff00000 00000000> 

多くの連続した浮動小数点値がファイル に書き込まれる場合は、を作成する方が効果的です配列 ビッグエンディアン表現を持つとDataにそれを変換し、 例

let values = [1.0, 2.0, 3.0, 4.0] 
let array = values.map { $0.bitPattern.bigEndian } 
let data = array.withUnsafeBufferPointer { Data(buffer: $0) } 

(スウィフト3および4と上記のすべてのコンパイル)

+0

マーティンR、迅速な応答のためにありがとう - 30分未満!正確に私が必要としたもの。私は内部ループの結果を配列(〜500〜1000の値)に格納できると付け加えましたが、あなたは私の編集を予期しました! :-)私はあなたの提案を実装し、私の結果を掲載します。 –

+0

私はMartinのアレイ提案をうまく実装しました。私はいくつかの "面白い"テスト値を使うべきだと決めた。 –

0

のための私は正常にマーティンの配列の提案を実施しました。私はいくつかの "面白い"テスト値を使うべきだと決めた。ここに私のテスト遊び場があります。私はそれが興味のあることを願っています:

//: Playground - noun: a place where people can play 

import UIKit 

func convert(doubleArray: [Double]) { 
    let littleEndianArray = doubleArray.map { $0.bitPattern} 
    var data = littleEndianArray.withUnsafeBufferPointer { Data(buffer: $0) } 
    print("Little-endian : ", data as NSData) 

    // Convert and display the big-endian bytes 
    let bigEndianArray = doubleArray.map { $0.bitPattern.bigEndian } 
    data = bigEndianArray.withUnsafeBufferPointer { Data(buffer: $0) } 
    print("Big-endian : ", data as NSData) 
} 
// Values below are from: 
//  https://en.wikipedia.org/wiki/Double-precision_floating-point_format 

let nan = Double.nan 
let plusInfinity     = +1.0/0.0 
let maxDouble      = +1.7976931348623157E308 
let smallestNumberGreaterThanOne = +1.0000000000000002 
let plusOne      = +1.0 
let maxSubnormalPositiveDouble = +2.2250738585072009E-308 
let minSubnormalPositiveDouble = +4.9E-324 
let plusZero      = +0.0 

let minusZero      = -0.0 
let maxSubnormalNegativeDouble = -4.9E-324 
let minSubnormalNegativeDouble = -2.2250738585072009E-308 
let minusOne      = -1.0 
let largestNumberLessThanOne  = -1.0000000000000002 
let minDouble      = -1.7976931348623157E308 
let minusInfinity     = -1.0/0.0 


let smallestNumber = "+1.0000000000000002" 
let largestNumber = "-1.0000000000000002" 



print("\n\nPrint little-endian and big-endian Doubles") 
print("\n\nDisplay: NaN and +0.0 to +1.0") 
print("              Min. Subnormal Max. Subnormal") 
print("     Not a Number  Plus Zero   Positive Double Positive Double Plus One") 
print(String(format: "Decimal  : NaN    %+8.6e  %+8.6e %+8.6e %+8.6e", plusZero, minSubnormalPositiveDouble, maxSubnormalPositiveDouble, plusOne)) 
var doubleArray = [nan, plusZero, minSubnormalPositiveDouble, maxSubnormalPositiveDouble, plusOne] 
convert(doubleArray: doubleArray) 

print("\n\nDisplay: +1.0 to +Infinity") 
print("         Smallest Number     ") 
print("     Plus One   Greater Than 1.0 Max. Double  +Infinity") 
print(String(format: "Decimal  : %+8.6e \(smallestNumber) %+8.6e%+8.6e", plusOne, maxDouble, plusInfinity)) 
doubleArray = [plusOne, smallestNumberGreaterThanOne, maxDouble, plusInfinity] 
convert(doubleArray: doubleArray) 

print("\n\nDisplay: NaN and -0.0 to -1.0") 
print("              Min. Subnormal Max. Subnormal") 
print("     Not a Number  Minus Zero  Negative Double Negative Double Minus One") 
print(String(format: "Decimal  : NaN    %+8.6e  %+8.6e %+8.6e %+8.6e", minusZero, maxSubnormalNegativeDouble, minSubnormalNegativeDouble, minusOne)) 
doubleArray = [nan, minusZero, maxSubnormalNegativeDouble, minSubnormalNegativeDouble, minusOne] 
convert(doubleArray: doubleArray) 

print("\n\nDisplay: -1.0 to -Infinity") 
print("         Smallest Number     ") 
print("     Minus One   Less Than -1.0 Min. Double  -Infinity") 
print(String(format: "Decimal  : %+8.6e \(largestNumber) %+8.6e%+8.6e", minusOne, minDouble, minusInfinity)) 
doubleArray = [minusOne, largestNumberLessThanOne, minDouble, minusInfinity] 
convert(doubleArray: doubleArray) 
関連する問題