【问题标题】:'UnsafePointer<UInt8>' is not convertible to 'UnsafePointer<_>''UnsafePointer<UInt8>' 不能转换为 'UnsafePointer<_>'
【发布时间】:2018-06-07 13:28:59
【问题描述】:

我正在做 TripleDES 加密和解密。收到此错误:

UnsafePointer&lt;UInt8&gt;' is not convertible to 'UnsafePointer&lt;_&gt;

我得到错误的代码是:

        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)
                }
            }
        }

有人可以帮忙吗?

【问题讨论】:

  • @kevin 更新了代码。
  • 我有一个非常相似的问题。你有想过这个吗?

标签: ios iphone swift tripledes


【解决方案1】:

此错误消息是一种编译器错误的结果:编译器无法编译代码并发出无效且误导性的错误消息。另见https://bugs.swift.org/browse/SR-5931

在大多数情况下,您可以:

  • 去掉类型注解(&lt;UInt8&gt;),揭示真正原因
  • 修复原因
  • 再次添加类型注解

【讨论】:

  • 谁能提供实际的解决方案?当我在我的情况下删除 时,它会使编译器崩溃,所以我永远看不到“原因”。
【解决方案2】:
    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)
            }
        }
    }

【讨论】:

    【解决方案3】:

    cryptData 是一个 NSMutableData 对象,因此可以使用 mutableBytes

    怎么样:

        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!")
        }
    

    【讨论】:

    • 这个答案并不能真正帮助我理解问题出在哪里。 :(
    猜你喜欢
    • 2020-03-22
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多