一种将UInt32阵列编组到UInt8的正确方法

时间:2017-04-27 13:15:46

标签: swift

    let eByteArr = withUnsafeBytes(of: &entropySliceHashes32) { (bytes) -> [UInt8] in
        return bytes.map { $0 }
    }

以某种方式将16个字节(4个4字节无符号整数)映射为8个字节:

(lldb) p entropySliceHashes32
([UInt32]) $R0 = 4 values {
  [0] = 414878621
  [1] = 3484496398
  [2] = 2937522763
  [3] = 3119551166
}

(lldb) p eByteArr
([UInt8]) $R1 = 8 values {
  [0] = 16
  [1] = 224
  [2] = 4
  [3] = 112
  [4] = 1
  [5] = 0
  [6] = 0
  [7] = 0
}

在swift3中更改底层16字节堆的表示的简洁低开销方法是什么?

2 个答案:

答案 0 :(得分:2)

我认为你的函数实际上是映射数组结构本身的原始字节,而不是内容。

我认为你可以得到这样的预期结果:

let eByteArr = entropySliceHashes32.withUnsafeBytes { 
    (bytes) -> [UInt8] in
    return bytes.map { $0 }
}

即。使用数组上的方法,而不是独立功能。

答案 1 :(得分:2)

正如杰里米所说,你必须打电话给withUnsafeBytes 数组上的方法,以获取元素存储的UnsafeRawBufferPointer

现在

  • UnsafeRawBufferPointerCollection(尤其是 Sequence的{​​{1}}和
  • UInt8有一个

    Array

    初​​始化。

因此,您可以从原始缓冲区指针创建/// Creates an array containing the elements of a sequence. /// /// - Parameter s: The sequence of elements to turn into an array. public init<S>(_ s: S) where S : Sequence, S.Iterator.Element == Element 数组 [UInt8]ptr

Array(ptr)

可以缩短为

let eByteArr = entropySliceHashes32.withUnsafeBytes {
    ptr in return Array(ptr)
}