无法理解withUnsafeBytes方法的工作方式

时间:2018-07-11 06:42:11

标签: swift unsafe-pointers

我正在尝试将数据转换为UnsafePointer。我找到了答案here,可以在其中使用withUnsafeBytes来获取字节。

然后我做了一个自我测试,发现我可以打印出字符串“ abc”的字节值

let testData: Data = "abc".data(using: String.Encoding.utf8)!

testData.withUnsafeBytes(
{(bytes: UnsafePointer<UInt8>) -> Void in

    NSLog("\(bytes.pointee)")

})

但是输出只是一个字符的值,即“ a”。

2018-07-11 14:40:32.910268+0800 SwiftTest[44249:651107] 97

那我该如何获取所有三个字符的字节值?

2 个答案:

答案 0 :(得分:1)

“指针”指向序列中第一个字节的地址。如果要使用指向其他字节的指针,则必须使用指针算术,即将指针移至下一个地址:

testData.withUnsafeBytes{ (bytes: UnsafePointer<UInt8>) -> Void in
    NSLog("\(bytes.pointee)")
    NSLog("\(bytes.successor().pointee)")
    NSLog("\(bytes.advanced(by: 2).pointee)")
}

testData.withUnsafeBytes { (bytes: UnsafePointer<UInt8>) -> Void in
    NSLog("\(bytes[0])")
    NSLog("\(bytes[1])")
    NSLog("\(bytes[2])")
}

但是,您必须知道testData的字节大小,并且不要溢出它。

答案 1 :(得分:1)

由于“字节”指向“ testdata”的起始地址,因此得到“ 97”。

您可以获取所有三个或n个字符的字节值,如以下代码所示:

let testData: Data = "abc".data(using: String.Encoding.utf8)!
print(testData.count)
testData.withUnsafeBytes(
    {(bytes: UnsafePointer<UInt8>) -> Void in
        for idx in 0..<testData.count {
            NSLog("\(bytes[idx])")
        }
})