我有一个
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]
?
答案 0 :(得分:4)
尝试类似:
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] = byteArr.map { UInt16($0) }
map对数组的每个元素执行一个函数并返回一个新数组
答案 1 :(得分:3)
UInt8 UInt8
将bytepattern与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
}
(编辑添加)
对于不那么臃肿的替代方案,您可以使用NSData
或UnsafePointer
,如以下Q&amp; A中所述:
(此Q&amp; A可能与此链接的副本重复)