2015-06-18 39 views
2

我想将通过蓝牙连接获得的类型为NSData的6字节十六进制转换为适当的整数值。我知道这是Big Endian类型,我需要共同小Endian。然而,每一次我尝试将其转换时间,我可以提取正确的数据,但结果一看不对,请参见下面的操场代码:试图将类型(BigEndian)的NSData从BlueTooth转换为Swift类型的Little Endian的Int

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 

回答

4

NSNumber是基础类和特别是值类型, 并且timeIn指针到数字实例。 您正在将该字节抽取到该指针中,这不是您想要的 ,并且可能导致各种未定义的行为或崩溃。

你应该做的是字节提取到一个UInt16变量:

var timeData:UInt16 = 0 
newdata.getBytes(&timeData, range: NSRange(location: 4, length: 2)) 
timeData = CFSwapInt16BigToHost(timeData) 
// Result: 1118 = 0x045E 

上一次的转换另一种方法是

/// Creates an integer from its big-endian representation, changing the 
/// byte order if necessary. 
timeData = UInt16(bigEndian: timeData) 
相关问题