在Swift 4中使用OpenSSL BN_hex2bn-如何构建句柄

时间:2019-01-09 15:02:37

标签: swift openssl swift4.2

我必须将int BN_hex2bn(BIGNUM **a, const char *str);用作Swift类;我实际上已经准备了以下代码:

class Test {
    var N : UnsafeMutablePointer<BIGNUM>
    var N_hex: String = "...HEX VALUE...";
    init() {
        self.N = BN_new()
    }
    use() {
        var Nhandle: UnsafeMutablePointer<UnsafeMutablePointer<BIGNUM>?>? = [???]
        BN_hex2bn(Nhandle, self.N_hex);
    }
}

好吧,正如您所了解的,我在初始化句柄时遇到了一些问题! :-)

更好:这是在Swift中使用此类功能的正确方法吗?有其他方法吗?如何初始化句柄?

谢谢您的回答!

1 个答案:

答案 0 :(得分:0)

BN_hex2bn()期望BIGNUM *的地址作为第一个参数,在Swift中,它是UnsafeMutablePointer<BIGNUM>?变量的地址。您“仅”必须声明该变量(使用nil自动初始化可选变量)并将其作为带有&的inout参数传递给该函数。示例:

let hexString = "123456789abcdef"

var bn: UnsafeMutablePointer<BIGNUM>?
BN_hex2bn(&bn, hexString)

// Do something with `bn` ...   

// Eventually free the memory:
BN_free(bn)

如果将其包装在Swift类中,则可以通过deinit方法释放资源:

class BN {
    var bn: UnsafeMutablePointer<BIGNUM>?

    init(hexString: String) {
        BN_hex2bn(&bn, hexString)
    }

    deinit {
        if let bn = bn { BN_free(bn) }
    }
}