使用Swift,我想将uint8_t数组中的字节转换为整数.

"C"示例:

char bytes[2] = {0x01, 0x02};
NSData *data = [NSData dataWithBytes:bytes length:2];
NSLog(@"data: %@", data); // data: <0102>

uint16_t value2 = *(uint16_t *)data.bytes;
NSLog(@"value2: %i", value2); // value2: 513

快速try :

let bytes:[UInt8] = [0x01, 0x02]
println("bytes: \(bytes)") // bytes: [1, 2]
let data = NSData(bytes: bytes, length: 2)
println("data: \(data)") // data: <0102>

let integer1 = *data.bytes // This fails
let integer2 = *data.bytes as UInt16 // This fails

let dataBytePointer = UnsafePointer<UInt16>(data.bytes)
let integer3 = dataBytePointer as UInt16 // This fails
let integer4 = *dataBytePointer as UInt16 // This fails
let integer5 = *dataBytePointer // This fails

在Swift中,从UInt8数组创建UInt16值的正确语法或代码是什么?

我对NSData版本感兴趣,正在寻找不使用临时数组的解决方案.

推荐答案

如果你想通过NSData,它的工作原理如下:

let bytes:[UInt8] = [0x01, 0x02]
println("bytes: \(bytes)") // bytes: [1, 2]
let data = NSData(bytes: bytes, length: 2)
print("data: \(data)") // data: <0102>

var u16 : UInt16 = 0 ; data.getBytes(&u16)
// Or:
let u16 = UnsafePointer<UInt16>(data.bytes).memory

println("u16: \(u16)") // u16: 513

或者:

let bytes:[UInt8] = [0x01, 0x02]
let u16 = UnsafePointer<UInt16>(bytes).memory
print("u16: \(u16)") // u16: 513

这两种变体都假定字节是按主机字节顺序排列的.

Update for Swift 3 (Xcode 8):

let bytes: [UInt8] = [0x01, 0x02]
let u16 = UnsafePointer(bytes).withMemoryRebound(to: UInt16.self, capacity: 1) {
    $0.pointee
}
print("u16: \(u16)") // u16: 513

Swift相关问答推荐

在swift静态var扩展中,如何或可以访问和返回具体类?

计算Vision OS相机与Vision OS中3D模型之间的距离

对多个项目的数组进行排序

SwiftUI:使视图B与视图A具有相同宽度的视图A更改比率?

Variadic泛型与Swift中的值和类型参数包

如何在自定义视图中读取修改符子元素?

KMM-Swift铸造密封类

SwiftUI 拖放:如果没有上下文类型,则无法解析对成员‘first’的引用

更改 SwiftUI 中按钮矩阵的填充 colored颜色

在 init(from decoder: Decoder) 方法中访问原始 JSON 数据

如何使用 ISO 国家代码(2 个字母)查找区域设置标识符

供应和普通数组中具有空值的 map 函数的行为不一致?

不使用 ViewController 时如何显示推送通知的alert 对话框

获取 SwiftUI 中 Binding 的值更改更新

在 xcode 13 中的构建之间保持可访问性权限

Swift中的分段错误

在 iOS 中使用 Swift 保存 PDF 文件并显示它们

Swift 中的 PageViewController 当前页面索引

如何轻松删除领域中的所有对象

TabView 在切换选项卡时重置导航堆栈