gpt4 book ai didi

swift - 试图在 Swift 中将类型 (BigEndian) 的 NSData 从 BlueTooth 转换为 Little Endian 类型的 Int

转载 作者:可可西里 更新时间:2023-11-01 00:52:56 25 4
gpt4 key购买 nike

我正在尝试将通过蓝牙连接获得的 NSData 类型的 6 字节十六进制转换为适当的整数值。我知道这是 Big Endian 类型,我需要转换为 little Endian。然而,每次我尝试转换它时,我都可以提取正确的数据,但结果看起来不对,请参见下面的 Playground 代码:

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 是一个基础类,特别是一个值类型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)

关于swift - 试图在 Swift 中将类型 (BigEndian) 的 NSData 从 BlueTooth 转换为 Little Endian 类型的 Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30925216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com