I am trying to convert a 6 byte hex of type NSData i got via bluetooth connection to appropriate integer values. I know this is of type Big Endian and i need to covnert to little Endian. However, every time i try to convert it, i can extract the right data, but the results look wrong, see playground code below:
var newdata = NSData(bytes: [0x26, 0x01, 0x45, 0x01, 0x04, 0x5e, ] as [UInt8], length:6)
//var timeData = newdata.subdataWithRange(NSMakeRange(4,2))
//var heelData = newdata.subdataWithRange(NSMakeRange(2,2))
//var frontData = newdata.subdataWithRange(NSMakeRange(0,2))
var timeData:UInt16 = 0
var heelData:UInt16 = 0
var frontData:UInt16 = 0
//var timeData = data.subdataWithRange(NSMakeRange(4,2))
var timeIn: NSNumber = NSNumber(unsignedShort: 0)
newdata.getBytes(&timeIn, range: NSRange(location: 4,length: 2))
timeData = CFSwapInt16BigToHost(timeIn.unsignedShortValue)
//24068
var heelIn: NSNumber = NSNumber(unsignedShort: 0)
newdata.getBytes(&heelIn, range: NSRange(location: 2, length: 2))
heelData = CFSwapInt16BigToHost(heelIn.unsignedShortValue)
//325
var frontIn: NSNumber = NSNumber(unsignedShort: 0)
newdata.getBytes(&frontIn, range: NSRange(location: 0, length: 2))
frontData = CFSwapInt16BigToHost(frontIn.unsignedShortValue)
//294
NSNumber
is a Foundation class and in particular a value type, andtimeIn
is a pointer to a number instance. You are extracting the bytes into that pointer, which is not what you want and can cause all kinds of undefined behavior or crashes.What you should do is to extract the bytes into an
UInt16
variable:An alternative to the last conversion is