Linux企業級專案實踐之網路爬蟲(16)——使用base64傳輸二進位制資料
用http傳輸二進位制的資料時,需要將二進位制做一下轉化,例如傳輸的int型別,將int型別之間轉為char以後,丟失掉了長度的資訊,如數字123456,本來只有4個位元組,但是轉化成文字的“123456”是有7個位元組。在int型別的時候固然好辦,但是一個陣列的時候,經過轉化以後,在轉化回來就很麻煩了。
同時對於一些數字,二進位制傳輸Server是沒法處理的。如int 1,二進位制資料是0x00000001,按位元組傳輸的時候,client能夠正常傳送,但是libevent收到以後,在拋給libevent_http層是,會把資料截斷,前兩位0x00是字串的停止符。
所以,只能用base64來解決這個問題。base64將二進位制的內容轉化成一組有意義的字串,然後傳輸,server在decode。
同時對於一些數字,二進位制傳輸Server是沒法處理的。如int 1,二進位制資料是0x00000001,按位元組傳輸的時候,client能夠正常傳送,但是libevent收到以後,在拋給libevent_http層是,會把資料截斷,前兩位0x00是字串的停止符。
所以,只能用base64來解決這個問題。base64將二進位制的內容轉化成一組有意義的字串,然後傳輸,server在decode。
long int encode( char *src,long int src_len, char *dst)
{
long int i = 0, j = 0;
char base64_map[65] = "BADCFEGHIJKLMNOPQRSTUVWXYZbadcfeghijklmnopqrstuvwxyz0123456789+/";
for (; i < src_len - src_len % 3; i += 3) {
dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)];
dst[j++] = base64_map[((src[i + 1] << 2) & 0x3C) + ((src[i + 2] >> 6) & 0x3)];
dst[j++] = base64_map[src[i + 2] & 0x3F];
}
if (src_len % 3 == 1) {
dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
dst[j++] = base64_map[(src[i] << 4) & 0x30];
dst[j++] = '=';
dst[j++] = '=';
}else if (src_len % 3 == 2) {
dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)];
dst[j++] = base64_map[(src[i + 1] << 2) & 0x3C];
dst[j++] = '=';
}
dst[j] = '/0';
printf("encode length:%ld/n",j);
return j;
}
long int decode(char *src, long int src_len, char *dst)
{
long int i = 0, j = 0;
unsigned char base64_decode_map[256] = {
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 62, 255, 255, 255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,
255, 0, 255, 255, 255, 1, 0, 3, 2, 5, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, 255, 27, 26, 29,
28, 31, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255};
for (; i < src_len; i += 4) {
dst[j++] = base64_decode_map[src[i]] << 2 |
base64_decode_map[src[i + 1]] >> 4;
dst[j++] = base64_decode_map[src[i + 1]] << 4 |
base64_decode_map[src[i + 2]] >> 2;
dst[j++] = base64_decode_map[src[i + 2]] << 6 |
base64_decode_map[src[i + 3]];
}
dst[j] = '/0';
printf("decode length :%ld/n",j);
return j;
}
相關文章
- 企業資料爬蟲專案(二)爬蟲
- 使用POST方法傳輸二進位制資料
- 企業資料爬蟲專案爬蟲
- 網路通訊4:HTTP實現二進位制傳輸HTTP
- 網路爬蟲專案爬蟲
- websocket 二進位制資料傳輸基礎準備工作Web
- WebSocket系列之二進位制資料設計與傳輸Web
- Python網路爬蟲實戰專案大全 32個Python爬蟲專案demoPython爬蟲
- 網路爬蟲(python專案)爬蟲Python
- 專案--python網路爬蟲Python爬蟲
- Python網路爬蟲實戰小專案Python爬蟲
- Python網路爬蟲實戰專案大全!Python爬蟲
- printf()將10進位制數安照輸出16進位制,8進位制輸出
- 2019最新《網路爬蟲JAVA專案實戰》爬蟲Java
- Java 爬蟲專案實戰之爬蟲簡介Java爬蟲
- 前端進階:二進位制資料的操控—-附專案程式碼前端
- 前端進階:二進位制資料的操控----附專案程式碼前端
- 國際網路專線能否保障企業資料的全球快速傳輸?
- 大資料爬蟲專案實戰教程大資料爬蟲
- 資料轉換-16進位制字元字元
- 彙編實現10進位制轉16進位制並以ASCII碼輸出ASCII
- 爬蟲實踐之獲取網易雲評論資料資訊爬蟲
- 104個實用網路爬蟲專案資源整理(超全)爬蟲
- 精通Scrapy網路爬蟲【一】第一個爬蟲專案爬蟲
- 輸出二進位制數
- C printf按8進位制、10進位制、16進位制輸出以及高位補0
- 在c語言中輸出8進位制數,16進位制數C語言
- Python爬蟲初學二(網路資料採集)Python爬蟲
- [Python] 網路爬蟲與資訊提取(1) 網路爬蟲之規則Python爬蟲
- webSocket 二進位制傳輸基礎準備-UTF-16和UTF-8轉UnicodeWebUnicode
- webSocket 二進位制傳輸基礎準備-Unicode轉UTF16和UTF8WebUnicode
- c++ 16進位制資料轉doubleC++
- python網路爬蟲--專案實戰--scrapy嵌入selenium,晶片廠級聯評論爬取(6)Python爬蟲晶片
- 資料檔案在網路“裸奔”,如何在網際網路中進行檔案傳輸?
- C++輸入十進位制數,輸出對應二進位制數、十六進位制數C++
- [網路爬蟲] 網路爬蟲實踐:大麥網演唱會預約搶票 【待續】爬蟲
- 網路爬蟲——專案實戰(爬取糗事百科所有文章)爬蟲
- 網路爬蟲——爬蟲實戰(一)爬蟲
- 複雜二進位制資料