此
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字节堆的表示的简洁低开销方法是什么?
答案 0 :(得分:2)
我认为你的函数实际上是映射数组结构本身的原始字节,而不是内容。
我认为你可以得到这样的预期结果:
let eByteArr = entropySliceHashes32.withUnsafeBytes {
(bytes) -> [UInt8] in
return bytes.map { $0 }
}
即。使用数组上的方法,而不是独立功能。
答案 1 :(得分:2)
正如杰里米所说,你必须打电话给withUnsafeBytes
数组上的方法,以获取元素存储的UnsafeRawBufferPointer
。
现在
UnsafeRawBufferPointer
是Collection
(尤其是
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)
}