Encode floats

This commit is contained in:
Damiaan Dufaux 2017-07-31 19:17:26 +02:00
parent afae5bb0bc
commit 112d35f359
3 changed files with 45 additions and 13 deletions

View file

@ -94,11 +94,11 @@ extension MsgPack.Serialiser: SingleValueEncodingContainer {
} }
func encode(_ value: Float) throws { func encode(_ value: Float) throws {
throw Error.notImplemented storage = .float32(value)
} }
func encode(_ value: Double) throws { func encode(_ value: Double) throws {
throw Error.notImplemented storage = .float64(value)
} }
func encode(_ value: String) throws { func encode(_ value: String) throws {

View file

@ -30,6 +30,9 @@ enum Format {
case int32(Int32) case int32(Int32)
case int64(Int64) case int64(Int64)
case float32(Float)
case float64(Double)
func appendTo(data: inout Data) { func appendTo(data: inout Data) {
switch self { switch self {
@ -128,6 +131,26 @@ enum Format {
#else #else
Format.int64(Int64(value)).appendTo(data: &data) Format.int64(Int64(value)).appendTo(data: &data)
#endif #endif
// MARK: Floats
case .float32(let value):
var newData = Data(count: 5)
newData.withUnsafeMutableBytes({ (byteContainer: UnsafeMutablePointer<UInt8>) -> Void in
byteContainer.pointee = 0xCA
byteContainer.advanced(by: 1).withMemoryRebound(to: UInt32.self, capacity: 1) {
$0.pointee = value.bitPattern.bigEndian
}
})
data.append(newData)
case .float64(let value):
var newData = Data(count: 9)
newData.withUnsafeMutableBytes({ (byteContainer: UnsafeMutablePointer<UInt8>) -> Void in
byteContainer.pointee = 0xCB
byteContainer.advanced(by: 1).withMemoryRebound(to: UInt64.self, capacity: 1) {
$0.pointee = value.bitPattern.bigEndian
}
})
data.append(newData)
} }
} }
} }

View file

@ -5,17 +5,26 @@ import Foundation
let encoder = Encoder() let encoder = Encoder()
let data = try encoder.encode(0x0102030405060708) let integerData = try encoder.encode(0x0102030405060708)
String(data[0], radix: 16) String(integerData[0], radix: 16)
data[1] integerData[1]
data[2] integerData[2]
data[3] integerData[3]
data[4] integerData[4]
data[5] integerData[5]
data[6] integerData[6]
data[7] integerData[7]
data[8] integerData[8]
try encoder.encode(Int8(6))[1] let doubleData = try encoder.encode(2.5)
String(doubleData[0], radix: 16)
doubleData[1]
doubleData[2]
doubleData[3]
doubleData[4]
doubleData[5]
doubleData[6]
doubleData[7]
doubleData[8]