2012-02-07 23 views
1

我想將一個BIO保存(管道/複製)到一個char數組中。 當我知道它的大小,但不是。將BIO保存爲char *(來自SMIME_write_CMS)

例如,我可以在我的char *的內容使用該

const unsigned char* data = ...  
myBio = BIO_new_mem_buf((void*)data, strlen(data)); 

存儲到BIO但是,當我嘗試使用SMIME_write_CMS這需要一個BIO(我所之前創建)的輸出它不起作用。

const int SIZE = 50000; 
unsigned char *temp = malloc(SIZE); 
memset(temp, 0, SIZE); 

out = BIO_new_mem_buf((void*)temp, SIZE); 
if (!out) { 
    NSLog(@"Couldn't create new file!"); 
    assert(false); 
} 


int finished = SMIME_write_CMS(out, cms, in, flags); 
if (!finished) { 
    NSLog(@"SMIME write CMS didn't succeed!"); 
    assert(false); 
} 

printf("cms encrypted: %s\n", temp); 

NSLog(@"All succeeded!"); 

OpenSSL參考使用直接文件輸出與BIO。 這工作,但我不能在Objective-C使用BIO_new_file()...: -/

out = BIO_new_file("smencr.txt", "w"); 
if (!out) 
    goto err; 

/* Write out S/MIME message */ 
if (!SMIME_write_CMS(out, cms, in, flags)) 
    goto err; 

難道你們有什麼建議嗎?

回答

2

我會建議嘗試使用SIZE-1,這樣就保證它是NULL終止。否則,它可能只是在運行緩衝區。

out = BIO_new_mem_buf((void*)temp, SIZE-1); 

讓我知道這是否有幫助。

編輯:

當使用BIO_new_mem_buf()它是一個只讀緩衝區,所以你不能寫它。如果你想寫入內存使用:

BIO *bio = BIO_new(BIO_s_mem()); 
+0

謝謝,這是另一個問題,但它並沒有解決我前面提到的問題。 : -/ 現在我已經使用了BIO_new(BIO_s_mem())而不是BIO_new_mem_buf()。味精存儲在那裏,但我需要它在一個字符*(讓說字符串)。所以我試着將BIO_read()寫成一個字符串:「unsigned char * temp = malloc(50000); memset(temp,0,50000); int size = BIO_read(out,temp,50000);」。 這工程順便說一句。我可以將它打印在屏幕上或將它保存在一個文件中,但由於字符串的靜態大小,它真的很難看。在閱讀之前,你知道如何確定BIO的大小嗎? (讀取返回大小...) – Chris 2012-02-08 09:03:36

+1

'long BIO_get_mem_data(BIO * b,char ** pp)'將pp設置爲指向存儲器BIO數據開始的指針並返回可用數據總量。它是作爲一個宏實現的。這應該有所幫助。 – 2012-02-08 23:31:43