2017-02-27 153 views
1

在这里,我试图让生物文件的大小,BIO_get_mem_ptr被returnig 0长度和输出

long res = BIO_get_mem_ptr(certBio, &bptr); 
length = bptr->length; // is the length 

我从一些stackoverflow问题此示例代码。我已经尝试了很多次,但是BIO_get_mem_ptrbptr中给出null指针,返回值为0。我无法在任何参考站点找到与此问题相关的任何解决方案。

这里是源代码,

int pass_cb(char *buf, int size, int rwflag, void *u) 
{ 
    int len; 
    char *tmp; 
    tmp = "123456"; 
    len = strlen(tmp); 

    if (len <= 0) 
     return 0; 
    if (len > size) 
     len = size; 
    memcpy(buf, tmp, len); 
    return len; 
} 

int main(void) 
{ 
    X509 *x509;  
    int length = 0; 

    unsigned char data[1000]; 
    unsigned char *buffer = NULL; 
    buffer = data; 

    BIO *certBio = BIO_new(BIO_s_file()); 
    // BIO *certBio = BIO_new(BIO_s_mem()); -> have tried this one too gives the same result 
    BUF_MEM *bptr = 0; 

    BIO_read_filename(certBio, "E:\\share\\Folder\\TempCert.pem"); 

    x509 = PEM_read_bio_X509_AUX(certBio, NULL, pass_cb, NULL); 

    long res = BIO_get_mem_ptr(certBio, &bptr); 
    length = bptr->length; 

    memset(&buffer, 0, 1000); 

    int ret = BIO_read(certBio, &buffer, length); 

    BIO_free_all(certBio); 
    CertFreeCertificateContext(pContext); 
    CertCloseStore(hStore, 0); 
    return 0; 
} 

请问是什么原因造成这里,

+0

The Man您可以验证'BIO_read_filename'获得成功吗?该函数应该返回'1'。如果成功并且只是一个猜测,但是......'x509 = PEM_read_bio_X509_AUX(certBio,NULL,pass_cb,NULL);'正在消耗数据。后来,当你检查BIO的可用长度时,剩下的是0. – jww

+0

另外,'unsigned char * buffer = new unsigned char(1000)'可能没有达到你想象的水平。另请参阅[我是否可以用圆括号真正初始化数组?](http://stackoverflow.com/q/8098922/608639)上面的示例中没有使用它,因此在编辑过程中将其删除。 – jww

+0

错误与BIO_get_mem_ptr函数 –

回答

1

正如你可以在The Manbio_get_mem_ptr看到想要一个memory BIO

内存BIO是源/ sink BIO为其I/O使用内存。写入存储器BIO的数据存储在适当扩展的BUF_MEM结构中以适应存储的数据。

您尝试使用一个文件,所以你应该使用示例代码上的bio_s_file

+0

迁移相同的示例也在bio_get_mem_ptr –

+0

上失败因为您不能直接使用它与'bio_s_file',因为你可以在man看到。您还有其他功能可以使用。 – LPs