当前位置: 首页 > 面试题库 >

在Swift中将两个字节的UInt8数组转换为UInt16

詹甫
2023-03-14
问题内容

使用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

快速尝试:

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

两种变体都假定字节按主机字节顺序排列。

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


 类似资料:
  • 问题内容: 我在将Byte数组快速转换为字符串时遇到问题。我搜索并找到一个简单的解决方案 但是显示错误没有成员。谁能建议我解决方案? 这是我要获取的代码,并将其转换为字节数组,然后我必须将该字节数组转换为字符串。 问题答案: Swift 3 / Xcode 8 更新 : 来自的字符串: 来自的字符串: Swift 2 / Xcode 7 更新 : 来自的字符串: 来自的字符串: 先前的答案: 没有

  • 问题内容: 如何将一个4字节的数组转换为相应的Int? 例: 输入: 输出: 我在互联网上发现的某些代码不起作用: 问题答案: 有两个问题: 在64位平台上是64位整数,您的输入数据只有32位。 在所有当前的Swift平台上使用小尾数表示法,您输入的是大尾数。 话虽如此,以下方法会起作用: 或在Swift 3中使用: 使用一些缓冲区指针魔术,您可以避免中间复制到对象(Swift 2): 有关此方法

  • 问题内容: 我有以下代码: 如何转换回相同的字节数组? 我问的原因是因为我想通过加密的十六进制字符串与服务器通信,所以我需要将其转换回字节数组以将字符串解码为其原始格式。 问题答案: 您可以将六进制字符串转换回UInt8数组,该数组每两个六个字符重复一次,并使用UInt8基数16初始化程序从中初始化UInt8: 编辑/更新: Xcode 14•Swift 5.1 操场:

  • 问题内容: 我正在尝试将字节切片转换为GoLang中的。我找不到在线解决此问题的方法。我见过先转换为字符串然后转换为a的建议,但这似乎不起作用,它失去了它的值,最后以零结束。 例: 而且它不起作用… 问题答案: 例如, 输出:

  • 问题内容: 我需要将缓冲区的长度存储在4个字节大的字节数组中。 伪代码: 做到这一点的最佳方法是什么?请记住,稍后我必须将该字节数组转换回整数。 问题答案: 您可以使用以下方式将其转换为字节: 注意,这样做时可能必须考虑字节顺序。

  • 问题内容: 如何将整个读入字节数组? 问题答案: 你可以使用Apache Commons IO处理此任务和类似任务。 该类型具有静态方法来读取和返回。 在内部,这会创建一个并将字节复制到输出中,然后调用。它通过复制4KiB块中的字节来处理大型文件。 分享改善这个答案