openssl之BIO系列之21---Base64型別的BIO (轉)

worldblog發表於2008-01-31
openssl之BIO系列之21---Base64型別的BIO (轉)[@more@]Base64型別BIO
 ---根據open doccryptobio_f_base64.pod翻譯和自己的理解寫成
 
 (作者:DragonKing, : wzhah@263 ,釋出於:之openssl專業論壇)
 
 該型別為過濾(filter)型別BIO,其定義如下(opensslbio.h,opensslevp.h):
  BIO_METHOD * BIO_f_base64(void);
 【BIO_f_base64】
 該返回一個Base64型別的BIO_METHOD結構,該結構定義如下(evpbio_b64.c):
 static BIO_METHOD methods_b64=
 {
  BIO_TYPE_BASE64,
  "base64 encoding",
  b64_write,
  b64_read,
  NULL, /* b64_puts, */
  NULL, /* b64_gets, */
  b64_ctrl,
  b64_new,
  b64_free,
  b64_callback_ctrl,
 };
 應該注意的是,該型別的BIO其定義並不在bio目錄下,而是在evp目錄下。
 當往該BIO寫入資料時,資料被Base64編碼,當從該BIO讀資料時,資料被Base64解碼。該BIO不支援BIO_gets和BIO_puts的功能。
 BIO_flush在該型別BIO被的時候,表示需要寫入的資料已經寫完,用來把最後的一段資料寫入到BIO裡面去。
 【BIO_set_flags】
 該函式可以用來設定標記BIO_FLAGS_BASE64_NO_NL,該標記設定後,將把所有資料編碼成為一行或者說期望所有資料都在一行上。需要注意的是,由於base64編碼本身格式的原因,不能準確可靠的決定編碼後的資料塊的結束位置,大家使用的時候自己需要注意資料的長度問題。
 【例子】
 下面的將字串"Hello Worldn"進行base64編碼並寫入到標準輸出裝置。
  BIO *bio, *b64;
  char message[] = "Hello World n";
 
  b64 = BIO_new(BIO_f_base64());
  bio = BIO_new_fp(stdout, BIO_NOCLOSE);
  bio = BIO_push(b64, bio);
  BIO_write(bio, message, strlen(message));
  BIO_flush(bio);
 
  BIO_free_all(bio);
 下面的程式將base64編碼的資料從標準輸入裝置讀出並將解碼資料輸出到標準輸出裝置:
  BIO *bio, *b64, bio_out;
  char inbuf[512];
  int inlen;
  char message[] = "Hello World n";
 
  b64 = BIO_new(BIO_f_base64());
  bio = BIO_new_fp(stdin, BIO_NOCLOSE);
  bio_out = BIO_new_fp(stdout, BIO_NOCLOSE);
  bio = BIO_push(b64, bio);
  while((inlen = BIO_read(bio, inbuf, strlen(message))) > 0)
  BIO_write(bio_out, inbuf, inlen);
 
  BIO_free_all(bio);

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998834/,如需轉載,請註明出處,否則將追究法律責任。

相關文章