Использование OpenSSL BN_hex2bn в Swift 4 - Как создать дескриптор - PullRequest
0 голосов
/ 09 января 2019

Я должен использовать 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 голосов
/ 09 января 2019

BN_hex2bn() ожидает адрес BIGNUM * в качестве первого аргумента, в Swift это адрес переменной UnsafeMutablePointer<BIGNUM>?. Вы «только» должны объявить эту переменную (дополнительные параметры автоматически инициализируются с nil) и передать ее в качестве входного аргумента с & в функцию. Пример:

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