gpt4 book ai didi

arrays - 我如何在 Swift 中将 [UInt8] 转换为 [UInt16]?

转载 作者:行者123 更新时间:2023-11-28 09:33:20 26 4
gpt4 key购买 nike

我有一个

var byteArr:[UInt8] = [126, 34, 119, 55, 1, 159, 144, 24, 108, 226, 49, 178, 60, 119, 133, 97, 189, 49, 111, 208]

我如何从中创建一个新的 var newArray:[UInt16]

最佳答案

UInt8 UInt8 将字节模式合并为 UInt16

如果您的意图是,如 MartinR 在对您的问题的评论中所暗示的那样,将成对的 UInt8(例如 8+8 位)转换为单个 UInt16( 16 位),一种可能的解决方案如下:

/* pair-wise (UInt8, UInt8) -> (bytePattern bytePattern) -> UInt16       */
/* for byteArr:s of non-even number of elements, return nil (no padding) */
func byteArrToUInt16(byteArr: [UInt8]) -> [UInt16]? {
let numBytes = byteArr.count
var byteArrSlice = byteArr[0..<numBytes]

guard numBytes % 2 == 0 else { return nil }

var arr = [UInt16](count: numBytes/2, repeatedValue: 0)
for i in (0..<numBytes/2).reverse() {
arr[i] = UInt16(byteArrSlice.removeLast()) +
UInt16(byteArrSlice.removeLast()) << 8
}
return arr
}

示例用法:

/* example usage */
var byteArr:[UInt8] = [
255, 255, // 0b 1111 1111 1111 1111 = 65535
0, 255, // 0b 0000 0000 1111 1111 = 255
255, 0, // 0b 1111 1111 0000 0000 = 65535 - 255 = 65280
104, 76] // 0b 0110 1000 0100 1100 = 26700

if let u16arr = byteArrToUInt16(byteArr) {
print(u16arr) // [65535, 255, 65280, 26700], OK
}

(编辑添加)

对于不那么臃肿的替代方案,您可以使用 NSDataUnsafePointer,如以下问答中所述:

(此问答可能与此链接的问答重复)

关于arrays - 我如何在 Swift 中将 [UInt8] 转换为 [UInt16]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36462021/

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