gpt4 book ai didi

ios - 将 NSData 字节转换为自定义对象

转载 作者:行者123 更新时间:2023-11-28 09:17:31 29 4
gpt4 key购买 nike

我正在启动一个项目来创建一个 iOS 应用程序以通过 BLE 与设备通信。作为一项新的努力,我正在尝试尽可能快速地做到这一点。该接口(interface)使用 GATT 和一组现有的自定义消息结构。我到了一个地步,我在 NSData 对象中拥有来自 BLE 的数据。我想以相当通用的方式强制转换或直接将其转换为我的消息结构。

我知道我可以直接从 NSData 对象的字节数组中或使用 NSInputStream 手动提取数据。虽然这有效,但它可能是一个维护问题,并且界面中有许多不同的消息。

有没有更简单的方法来做到这一点?

我愿意在 Objective-C 中创建消息结构并在那里进行转换,但我对 Objective-C 的了解并不比我对 Swift 的了解好多少。

下面显示了我在 Playground 上玩过的一些示例代码。一切都按预期工作。

func getBytesFromNSData(data: NSData, start: Int) -> [UInt8] {
let count = data.length / sizeof(UInt8)
let remaining = count - start
let range = NSMakeRange(start, remaining )
var dataArray = [UInt8](count: remaining, repeatedValue: 0)
data.getBytes(&dataArray, range: range)
return dataArray
}

class TestObject {
var a: Byte
var b: Byte

init() {
a = 0x01
b = 0x02
}

init(data: NSData) {
let dataBytes = getBytesFromNSData(data, 0)
a = Byte(dataBytes[0])
b = Byte(dataBytes[1])
}

func populateFromStream(data: NSData) {
var stream = NSInputStream(data: data)
stream.open()
var bytesRead = stream.read(&a, maxLength: 1)
println("\(bytesRead)")

bytesRead = stream.read(&b, maxLength: 1)
println("\(bytesRead)")
}

func toArray() -> [Byte] {
var result = [Byte](count: 2, repeatedValue: 0)
result[0] = a
result[1] = b

return result
}
}

let test = TestObject()
let testArray = test.toArray()
let length = testArray.count
let testData = NSData(bytes: testArray, length: length)
println("\(testData)")

let testIn = [ Byte(0x0d), Byte(0x0e) ]
let testDataIn = NSData(bytes: testIn, length: testIn.count)
println("\(testDataIn)")

let testConstructor = TestObject(data: testDataIn)

var testObject = TestObject()
testObject.populateFromStream(testDataIn)

最佳答案

我发现了一种相当通用的方法,在某些情况下可能会起作用。

  1. 创建一个 Objective-C 骑行 header
  2. 将数据结构创建为 Objective-C 结构
  3. 将带有数据结构的头部导入桥接头部
  4. 假设您有一个名为 Foo 的结构和一个名为 rawData 的 NSData 对象:

使用以下代码获取指针。

let structureSize = sizeof(Foo)
var myObject = UnsafeMutablePointer<Foo>.alloc(1).memory
rawData.getbytes(&myObject, length: structureSize)

这并非在所有情况下都有效,不幸的是在我的特定情况下确实有效。我发现的具体问题是:

  • Objective-C 结构是字对齐的。如果您的结构未与工作边界正确对齐,则您的尺寸可能不正确。 (我在我的特定界面中遇到的东西)
  • 如果您要处理的系统发送数据的顺序与您期望的顺序不同,那么这将不会处理任何字节顺序转换,这仍然需要完成,并且结构可能需要重新排序补偿。这项工作可能会抵消这种方法的任何节省。

如果它恰好适用于您的特定消息格式,这是我发现的最简洁的方法。

关于ios - 将 NSData 字节转换为自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26756941/

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