Objective-C和Swift之间字节数组的类型转换
Type conversation of byte array between Objective-C and Swift
我正在使用一个用 Objective-C 编写的库,它有一个 属性 组织为一个结构并包含一个字节数组:
typedef struct {
byte ID[MAX_ID_LENGTH];
short Length;
...
} RFIDTag;
MAX_ID_LENGTH
是一个常量,值为64。
我将库连接到我的 swift 项目,到目前为止工作正常,但我想知道 属性 RFIDTag.ID
的 return 类型是
byteID (UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8)
swift。每个字节值都可以通过 属性 RFIDTag.ID.0
、RFIDTag.ID.1
等
访问
但我想将整个 ID 存储在一个数组中,而不需要手动复制每个值。
此时,我无法将 ID 属性 分配给根据 var array = [UInt8](count:64, repeatedValue:0)
或类似方法初始化的 swift 数组。
有人知道如何解决这个问题吗?
提前致谢并问候
马可
您可以通过从缓冲区指针构造数组来将这些值复制到数组中。例如:
let array: [UInt8] = withUnsafePointer(&byteID) { bytePtr in
let buffer = UnsafeBufferPointer(start: UnsafePointer<UInt8>(bytePtr), count: 64)
return Array(buffer)
}
这将创建一个指向元组的指针,将其转换为指向 UInt8 的指针,将其转换为缓冲区,然后使用缓冲区初始化数组。请注意 byteID
必须是 var
,而不是 let
值,以便您可以在其上使用 &
。这可能会迫使您制作元组的两个副本。 (我很确定还有另一种技术可以避免额外的副本,但在这种情况下可能没什么大不了的。)
我正在使用一个用 Objective-C 编写的库,它有一个 属性 组织为一个结构并包含一个字节数组:
typedef struct {
byte ID[MAX_ID_LENGTH];
short Length;
...
} RFIDTag;
MAX_ID_LENGTH
是一个常量,值为64。
我将库连接到我的 swift 项目,到目前为止工作正常,但我想知道 属性 RFIDTag.ID
的 return 类型是
byteID (UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8)
swift。每个字节值都可以通过 属性 RFIDTag.ID.0
、RFIDTag.ID.1
等
但我想将整个 ID 存储在一个数组中,而不需要手动复制每个值。
此时,我无法将 ID 属性 分配给根据 var array = [UInt8](count:64, repeatedValue:0)
或类似方法初始化的 swift 数组。
有人知道如何解决这个问题吗?
提前致谢并问候
马可
您可以通过从缓冲区指针构造数组来将这些值复制到数组中。例如:
let array: [UInt8] = withUnsafePointer(&byteID) { bytePtr in
let buffer = UnsafeBufferPointer(start: UnsafePointer<UInt8>(bytePtr), count: 64)
return Array(buffer)
}
这将创建一个指向元组的指针,将其转换为指向 UInt8 的指针,将其转换为缓冲区,然后使用缓冲区初始化数组。请注意 byteID
必须是 var
,而不是 let
值,以便您可以在其上使用 &
。这可能会迫使您制作元组的两个副本。 (我很确定还有另一种技术可以避免额外的副本,但在这种情况下可能没什么大不了的。)