![](/img/trans.png)
[英]How to create UnsafeMutablePointer<CGPoint> Object in swift
[英]How to get length of a UnsafeMutablePointer<Object> written to a OpenSSL BIO in Swift?
我正在使用 OpenSSL,因此必須使用一些UnsafeMutablePointer
對象。
我正在運行以下代碼
var x509_REQ : UnsafeMutablePointer<X509_REQ> = someObject
let b = BIO_new(BIO_s_mem())
let size = 3000
let status = i2d_X509_REQ_bio(b, x509_REQ)
guard status == 1 else{
BIO_free(b)
return "Failed to execute i2d_X509_REQ_bio command"
}
let bp = UnsafeMutableRawPointer.allocate(byteCount: size, alignment: 1)
BIO_read(b, bp, Int32(size))
BIO_free(b)
let data = Data(bytes: bp, count: size)
上面的代碼使用 OpenSSL 方法i2d_X509_REQ_bio
將 OpenSSL X509_REQ
對象轉換為DER
。 我遇到的問題是BIO_read
命令和UnsafeMutablePointer
存儲對象都需要字節數的大小計數。 有人知道在 Swift 中UnsafeMutablePointer<Any>
指向的對象的字節長度的正確方法嗎? (我現在正在硬編碼一個任意數字,3000,這是非常糟糕的) X509_Req
對象上沒有任何size
或count
輔助方法,並且深入研究 Apple 的文檔我沒有看到明確的方法在指針處找到對象的長度。
指針只是一個內存地址,沒有它指向的內存區域大小的任何信息。
但是——如果我理解正確的話——你真正需要的是寫入基於內存的 BIO 的字節數。 這就是BIO_get_mem_data
的用途。 不幸的是,OpenSSL 庫將其實現為宏
# define BIO_get_mem_data(b,pp) BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)pp)
它沒有導入到 Swift 中,因此您必須直接調用BIO_ctrl
。
示例(為簡潔起見省略了錯誤檢查):
// Create memory-based BIO:
let membio = BIO_new(BIO_s_mem())
// Write to BIO:
let status = i2d_X509_REQ_bio(membio, x509_REQ)
// Get pointer to the start of the memory BIOs data
// and amount of data available:
var ptr: UnsafeMutableRawPointer?
let len = BIO_ctrl(membio, BIO_CTRL_INFO, 0, &ptr)
// Create `Data` object from that memory region:
let data = Data(bytes: ptr!, count: len)
// Release BIO:
BIO_vfree(membio)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.