openssl之BIO系列之21---Base64型別的BIO (轉)
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);
---根據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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- openssl之BIO系列之13---Socket型別BIO (轉)型別
- openssl之BIO系列之11---檔案(file)型別BIO (轉)型別
- BIO到NIO原始碼的一些事兒之BIO原始碼
- Java雜記10—BIO,BIO和NIO的區別Java
- BIO、NIO的區別
- BIO、NIO、AIO的區別AI
- NIO、BIO、AIO區別AI
- From BIO to NIO series —— BIO source code interpretation
- BIO、NIO、AIOAI
- 從零開始netty學習筆記之BIONetty筆記
- Java BIO,NIO,AIOJavaAI
- BIO到NIO原始碼的一些事兒之NIO 下 之 Selector原始碼
- BIO到NIO原始碼的一些事兒之NIO 中原始碼
- BIO到NIO原始碼的一些事兒之NIO 上原始碼
- TS系列之型別型別
- java BIO、NIO學習Java
- BIO,NIO,AIO概覽AI
- BIO、NIO、AIO區別(看不懂你打我)AI
- java BIO/NIO/AIO 學習JavaAI
- JAVA阻塞IO(BIO)簡介Java
- 三分鐘秒懂BIO/NIO/AIO區別?AI
- openssl之EVP系列之2---對稱加密演算法概述 (轉)加密演算法
- NIO、BIO、AIO 與 PHP 實現AIPHP
- BIO、NIO、多路複用IO、AIOAI
- 一文搞懂NIO、AIO、BIO的核心區別(建議收藏)AI
- BIO到NIO原始碼的一些事兒之NIO 下 Buffer解讀 下原始碼
- BIO到NIO原始碼的一些事兒之NIO 下 Buffer解讀 上原始碼
- tomcat執行模式(bio,aio,apr)Tomcat模式AI
- 強制型別轉換之(==)型別
- Java核心(五)深入理解BIO、NIO、AIOJavaAI
- 從BIO和NIO到Netty實踐Netty
- Java網路程式設計 全面理解BIOJava程式設計
- 網路程式設計NIO:BIO和NIO程式設計
- 【spring原始碼系列】之【FactoryBean型別的介面】Spring原始碼Bean型別
- dart系列之:dart語言中的內建型別Dart型別
- 前端面試官必問系列之隱式型別轉換前端面試型別
- 面試官:BIO、NIO、AIO是什麼,他們有什麼區別?面試AI
- Hive學習之型別轉化Hive型別