openssl之BIO系列之21---Base64類型的BIO

Base64類型BIO

    ---根據openssl doc\crypto\bio_f_base64.pod翻譯和自己的理解寫成

    (作者:DragonKing, Mail: [email protected] ,發佈於:http://gdwzh.126.com之o

penssl專業論壇)

    該類型爲過濾(filter)類型BIO,其定義如下(openssl\bio.h,openssl\evp.h)

     BIO_METHOD * BIO_f_base64(void);

    【BIO_f_base64】

    該函數返回一個Base64類型的BIO_METHOD結構,該結構定義如下(evp\bio_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 World\n"進行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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章