swift 3:如何扩展[UInt8]以添加getUInt32BE函数
我试图用swift 3:如何扩展[UInt8]以添加getUInt32BE函数,swift,bit-manipulation,swift3,Swift,Bit Manipulation,Swift3,我试图用getUInt32BE()函数扩展[UInt8],如下代码所示 以下是我收到的错误: “无法使用类型为的索引为“Self”类型的值下标。” “范围” 有人能帮我纠正这个错误吗 Iterator.Element==UInt8的扩展集合{ 公共函数getUInt32BE(at:Int=0)->UInt32{ 返回self[at..Alternative#1:使用非安全指针的属性.pointee 如以下问答所述 您可以在Swift 2.2中使用,例如 备选方案2:使用位移位 或者,使用
getUInt32BE()
函数扩展[UInt8]
,如下代码所示
以下是我收到的错误:
“无法使用类型为的索引为“Self”类型的值下标。”
“范围”
有人能帮我纠正这个错误吗
Iterator.Element==UInt8的扩展集合{
公共函数getUInt32BE(at:Int=0)->UInt32{
返回self[at..Alternative#1:使用非安全指针的属性.pointee
如以下问答所述
您可以在Swift 2.2中使用,例如
备选方案2:使用位移位
或者,使用上面的修改版本进行位移位(类似于您问题的尝试),而不是使用UnsafePointer
:
有关收集
协议的详细信息(上述错误的原因是未使用此协议的关联类型索引.Distance
来构造子数组),请参阅例如
@我很乐意提供帮助。请注意,我已经稍微更新了答案,现在使用了.bigEndian
属性(而不是反转字节
数组),而之前的答案假设主机字节顺序是little-endian(不是很一般,但不是固定的)。
UnsafePointer<UInt16>(bytes).memory
extension Collection where Iterator.Element == UInt8 {
public func getUInt32BE(at: Index.Distance) -> UInt32? {
let from = startIndex.advanced(by: at, limit: endIndex)
let to = from.advanced(by: 4, limit: endIndex)
guard case let bytesSlice = self[from..<to]
where from.distance(to: to) == 4 else { return nil }
return bytesSlice.reduce(0) { (tot, val) -> UInt32 in
tot << 8 + UInt32(val as! UInt8)
}
}
}
/* example usage */
let bytes: [UInt8] = [
0, // 0b 0000 0000
255, // 0b 1111 1111
0, // 0b 0000 0000
104, // 0b 0110 1000
76] // 0b 0100 1100
/* byteArr[1..<5], big-endian:
0b 1111 1111 0000 0000 0110 1000 0100 1100 */
let u32verify = 0b11111111000000000110100001001100
print(u32verify) // 4278216780
if let u32val = bytes.getUInt32BE(1) {
print(u32val) // 4278216780, OK
}