简体   繁体   English

“UnsafePointer <UInt8> &#39;不能转换为&#39;UnsafePointer &lt;_&gt;&#39;

[英]'UnsafePointer<UInt8>' is not convertible to 'UnsafePointer<_>'

I'm doing tripleDES encryption and decryption. 我正在做tripleDES加密和解密。 Getting this error: 得到此错误:

UnsafePointer<UInt8>' is not convertible to 'UnsafePointer<_>

The code where I'm getting the error is: 我收到错误的代码是:

        let keyString        = "25d1d4cb0a08403e2acbcbe0"
        let keyData = keyString.data(using: .utf8)!
        let message       = pass
        let data = message.data(using: .utf8)!
        let cryptData    = NSMutableData(length: Int(data.count) + kCCBlockSize3DES)!
        let keyLength              = size_t(kCCKeySize3DES)
        let operation: CCOperation = UInt32(kCCEncrypt)
        let algoritm:  CCAlgorithm = UInt32(kCCAlgorithm3DES)
        let options:   CCOptions   = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)

        var numBytesEncrypted :size_t = 0

        let cryptStatus = keyData.withUnsafeBytes { (keyBytes: UnsafePointer<UInt8>) in
            data.withUnsafeBytes { (dataBytes: UnsafePointer<UInt8>) in
                cryptData.withUnsafeMutableBytes { (cryptBytes: UnsafeMutablePointer<UInt8>) in
                    CCCrypt(operation,
                            algoritm,
                            options,
                            keyBytes,
                            keyLength,
                            nil,
                            dataBytes,
                            data.count,
                            cryptBytes,
                            cryptData.count,
                            &numBytesEncrypted)
                }
            }
        }

Anyone could help? 有人可以帮忙吗?

This error message is the result of a sort of compiler bug: the compiler cannot compile the code and emits an invalid and misleading error message. 此错误消息是一种编译器错误的结果:编译器无法编译代码并发出无效且误导性的错误消息。 Also see https://bugs.swift.org/browse/SR-5931 另请参阅https://bugs.swift.org/browse/SR-5931

In most cases, you can: 在大多数情况下,您可以:

  • remove the type annotation ( <UInt8> ) to reveal the real cause 删除类型注释( <UInt8> )以显示真正的原因
  • fix the cause 解决原因
  • add the type annotation again 再次添加类型注释
    let keyString        = "25d1d4cb0a08403e2acbcbe0"
    let keyData = keyString.data(using: .utf8)!
    let message       = pass
    let data = message.data(using: .utf8)!
    let cryptData    = NSMutableData(length: Int(data.count) + kCCBlockSize3DES)!
    let keyLength              = size_t(kCCKeySize3DES)
    let operation: CCOperation = UInt32(kCCEncrypt)
    let algoritm:  CCAlgorithm = UInt32(kCCAlgorithm3DES)
    let options:   CCOptions   = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)

    var numBytesEncrypted :size_t = 0

    let cryptStatus = keyData.withUnsafeBytes { (keyBytes: UnsafePointer<UInt8>) in
        data.withUnsafeBytes { (dataBytes: UnsafePointer<UInt8>) in
            cryptData.withUnsafeMutableBytes { (cryptBytes: UnsafeMutablePointer<UInt8>) in
                CCCrypt(operation,
                        algoritm,
                        options,
                        keyBytes,
                        keyLength,
                        nil,
                        dataBytes,
                        data.count,
                        &cryptBytes, //<-----try to do this
                        cryptData.count,
                        &numBytesEncrypted)
            }
        }
    }

cryptData is a NSMutableData object, so it has mutableBytes to work with. cryptData是一个NSMutableData对象,因此它有mutableBytes可以使用。

How about: 怎么样:

    let keyString        = "25d1d4cb0a08403e2acbcbe0"
    let keyData = keyString.data(using: .utf8)!
    let message       = pass
    let data = message.data(using: .utf8)!
    let cryptData    = NSMutableData(length: Int(data.count) + kCCBlockSize3DES)!
    let keyLength              = size_t(kCCKeySize3DES)
    let operation: CCOperation = UInt32(kCCEncrypt)
    let algoritm:  CCAlgorithm = UInt32(kCCAlgorithm3DES)
    let options:   CCOptions   = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)

    var numBytesEncrypted :size_t = 0

    let cryptStatus = keyData.withUnsafeBytes { (keyBytes : UnsafePointer<UInt8>) in
        data.withUnsafeBytes { (dataBytes : UnsafePointer<UInt8>) in

            CCCrypt(operation,
                    algoritm,
                    options,
                    keyBytes,
                    keyLength,
                    nil,
                    dataBytes,
                    data.count,
                    cryptData.mutableBytes,
                    cryptData.length,
                    &numBytesEncrypted)

        }
    }

    if UInt32(cryptStatus) == UInt32(kCCSuccess) {
        print("success!")
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM