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

时间:2016-04-06 20:47:29

标签: arrays swift

我有一个

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]

2 个答案:

答案 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
}

(编辑添加)

对于不那么臃肿的替代方案,您可以使用NSDataUnsafePointer,如以下Q&amp; A中所述:

(此Q&amp; A可能与此链接的副本重复)