C++ 實現圖片base64編解碼
最近使用人臉識別restfulAPI遇到了要求圖片base64編碼後傳輸問題。
藉此機會瞭解下什麼是base64編碼。
1 什麼是base64編碼
所謂Base64,就是說選出64個字元—-小寫字母a-z、大寫字母A-Z、數字0-9、符號”+”、”/”(再加上作為墊字的”=”,實際上是65個字元)—-作為一個基本字符集。然後,其他所有符號都轉換成這個字符集中的字元。
2 解決的問題
網路傳送渠道(純文字協議)並不支援所有的位元組,例如傳統的郵件只支援可見字元的傳送,像ASCII碼的控制字元就不能通過郵件傳送。
http針對二進位制資料做了特殊規定是可以支援傳輸二進位制資料的,但如果在json內部傳輸二進位制資料就會遇到這種問題,我們可以先進行base64編碼轉成字串進行處理。
3 主要用途
證書 電子郵件資料,經常要用到Base64編碼。
4 如何編碼
第一步,將每三個位元組作為一組,一共是24個二進位制位。
第二步,將這24個二進位制位分為四組,每個組有6個二進位制位。
第三步,在每組前面加兩個00,擴充套件成32個二進位制位,即四個位元組。
第四部, 每個位元組的對應符號即為base64編碼後的值。
Base64編碼後的文字,會比原文字大出三分之一左右。
5 程式碼實現
nodejs實現:
var base64str1 = new Buffer(bitmap).toString('base64');
C++實現:
以下程式碼來自百度雲SDK中base64編碼部分。簡單好用。
Bash64.h:
#ifndef __BASE64_H__
#define __BASE64_H__
#include <iostream>
#include <string>
static const std::string base64_chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
static inline bool is_base64(const char c)
{
return (isalnum(c) || (c == '+' ) || (c == '/'));
}
std::string base64_encode(const char * bytes_to_encode, unsigned int in_len)
{
std::string ret;
int i = 0;
int j = 0;
unsigned char char_array_3[3];
unsigned char char_array_4[4];
while (in_len--)
{
char_array_3[i++] = *(bytes_to_encode++);
if(i == 3)
{
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for(i = 0; (i <4) ; i++)
{
ret += base64_chars[char_array_4[i]];
}
i = 0;
}
}
if(i)
{
for(j = i; j < 3; j++)
{
char_array_3[j] = '\0';
}
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for(j = 0; (j < i + 1); j++)
{
ret += base64_chars[char_array_4[j]];
}
while((i++ < 3))
{
ret += '=';
}
}
return ret;
}
std::string base64_decode(std::string const & encoded_string)
{
int in_len = (int) encoded_string.size();
int i = 0;
int j = 0;
int in_ = 0;
unsigned char char_array_4[4], char_array_3[3];
std::string ret;
while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
char_array_4[i++] = encoded_string[in_]; in_++;
if (i ==4) {
for (i = 0; i <4; i++)
char_array_4[i] = base64_chars.find(char_array_4[i]);
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
for (i = 0; (i < 3); i++)
ret += char_array_3[i];
i = 0;
}
}
if (i) {
for (j = i; j <4; j++)
char_array_4[j] = 0;
for (j = 0; j <4; j++)
char_array_4[j] = base64_chars.find(char_array_4[j]);
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
}
return ret;
}
#endif
Test_main.cpp:
#include <string>
#include <iostream>
#include "base64.h"
#include <fstream>
using namespace std;
int main(int argc, char** argv){
fstream f;
f.open("test.jpg", ios::in|ios::binary);
f.seekg(0, std::ios_base::end);
std::streampos sp = f.tellg();
int size = sp;
char* buffer = (char*)malloc(sizeof(char)*size);
f.read(buffer,size);
cout << "file size:" << size << endl;
string imgBase64 = base64_encode(buffer, size);
cout << "img base64 encode size:" << imgBase64.size() << endl;
string imgdecode64 = base64_decode(imgBase64);
cout << "img decode size:" << imgdecode64.size() << endl;
return 0;
}
編譯:
g++ -D_LINUX -I. -std=c++11 ./test_main.cpp -o sample_X86_64、
輸出:
file size:23615
img base64 encode size:31488
img decode size:23615
相關推薦
C++ 實現圖片base64編解碼
最近使用人臉識別restfulAPI遇到了要求圖片base64編碼後傳輸問題。 藉此機會瞭解下什麼是base64編碼。 1 什麼是base64編碼 所謂Base64,就是說選出64個字元—-小寫字母a-z、大寫字母A-Z、數字0-9、符號”+”、”
9.C++中的base64編解碼實現
#include <string> #include <iostream> #include<stdio.h> using namespace std; std::string base64_encode(unsigned char con
Libb64:c/c++實現的base64編碼解碼庫函式
base64編碼解碼本身也不復雜,但要自己寫,還是得花點時間,如果能找到現成的可靠的程式碼,抄來最好,節省了測試的時間。 libb64就是實現base64編碼解碼的開源庫,還提供了C++封裝,用起來也挺方便 下面是使用libb64 C++封裝介面進行ba
C++實現base64編解碼
將昨天的php程式碼改造成C++ /*base_64.h檔案*/ #ifndef BASE_64_H #define BASE_64_H /** * Base64 編碼/解碼 * @author liruixing */ class Base64{ private: std
ubuntu下c++中base64編解碼測試和圖片編解碼測試
全棧工程師開發手冊 (作者:欒鵬) 字元陣列的base64編解碼 base64.h #include <string> std::string base64_encode(unsigned char const* , unsigned in
base64編解碼原理與C程式碼實現
1、base64編碼原理分析: (1)、背景與應用: 可參考部落格:Base64編碼原理與應用 所謂base64就是基於ASCII碼的64個可見字元子集的一種編碼方式。 (2)、編碼原理與核心分析: 上面提到的子集如下所示: A~Z、a~z、0~
在C語言中使用Libb64進行Base64編解碼
tar 語言 number const string ken doc get eof Libb64下載地址http://sourceforge.net/projects/libb64 以下為Demo CLibb64Demo.c #include <stdio.h&g
Java實現Base64編解碼
為什麼要用Base64編碼 在網路中傳輸資料都是使用ascii方式傳輸。對於一些圖片、視訊等資料,可能就會被編碼成ascii中不可見部分的編碼。網路中不同的路由裝置處理方式不同,有可能就會把這部分資料弄丟了。為了保證資料傳輸的正確性,可以使用Base64編碼將這些不可見資料編碼成可見資料。 Java實現B
c語言通過openssl aes對稱加解密和base64編解碼將密碼儲存成密文
今天遇到這樣一個問題,將客戶端中的一個密碼儲存到檔案中以供下次使用,但是儲存的密碼不能直接儲存明文,需要進行加密處理,再三考慮之後,這個加密的過程需要雙向的可逆的過程,MD5等方式是不適用的,因為記住密碼意味著下次我還需要還原這個密碼進行使用,所以最後選擇了openssl的aes演算法,然而ae
[c++]base64編解碼 and image
//½«Í¼ÏñתΪbase64¸ñʽ vector&l
boost庫實現Base64編解碼
Base64介紹 Base64是一種基於64個可列印字元來表示二進位制資料的表示方法,從本質上看Base64編碼就是將三位元組轉換為四位元組,如果資料的長度不是3的整數倍,就要在後面補0再計算,每補2個0就再Base64串後加上1個‘=’。 boost庫Base64
Android實戰技巧之三十七:圖片的Base64編解碼
通常用Base64這種編解碼方式將二進位制資料轉換成可見的字串格式,就是我們常說的大串,10塊錢一串的那種,^_^。 Android的android.util包下直接提供了一個功能十分完備的Base64類供我們使用,下面就演示一下如何將一張圖片進行Base64
可以相互解密的C#版及C++版DES演算法程式碼(包括ECB、CBC模式,Zeros、PKCS7填充,以及Base64編解碼)
由於C#中對於DES演算法有標準類,所以使用起來特別簡單;但C++就有點費勁了,經過整合網上資源並修改bug,現在放出完整C++DES演算法程式碼,已測試通過。這裡要特別感謝http://blog.csdn.net/bengold1979/article/details/2
Base64編解碼(C++版) (轉)
標頭檔案h#include <string>using namespace std;class ZBase64{public: /*編碼 DataByte [in]輸入的資料長度,以位元組為單位 */ string Encode(const unsigned
c++ 實現圖片轉base64
原理:原因:網路傳送渠道並不支援所有的位元組,例如傳統的郵件只支援可見字元的傳送,像ASCII碼的控制字元就不能通過郵件傳送。這樣用途就受到了很大的限制,比如圖片二進位制流的每個位元組不可能全部是可見字元,所以就傳送不了。最好的方法就是在不改變傳統協議的情 況下,做一種擴充套
Java實現BASE64編解碼 maven
Java語言提供了一個非常好的BASE64演算法的實現,即Apache Commons Codec工具包。其MAVEN配置如下, </dependency> <!-- https://mvnrepository.com/artifact/c
C++實現圖片的base64編碼
1.base64編碼的原因 網路傳送渠道並不支援所有的位元組,例如傳統的郵件只支援可見字元的傳送,像ASCII碼的控制字元就不能通過郵件傳送。這樣用途就受到了很大的限制,比如圖片二進位制流的每個位元組不可能全部是可見字元,所以就傳送不了。最好的方法就是在不改變傳統協議的情
c#實現圖片二值化例子(黑白效果)
rec con devel 圖片 round amp bsp 操作 spl C#將圖片2值化示例代碼,原圖及二值化後的圖片如下: 原圖: 二值化後的圖像: 實現代碼:using System; using System.Drawing; namespace BMP2G
Android中使用commons-codec-1.6.jar 進行Base64編解碼出現的問題
deb 分享 == 通過 HR common jar hive java 編碼時出現異常: java.lang.NoSuchMethodError: No static method encodeBase64String([B)Ljava/lang/String; i
python3url編解碼base64編解碼ASE加解密
字元編解碼 Python3相對於Python2的一大改變就是,對預設字元型別進行了修改。Python2中定義字串預設為二進位制字串,強制加字首u的才是unicode字串;而Python3中字串預設為unicode,強制加字首b的才是二進位制字串。(也就是剛好反過來了) 這裡的二進位制字串:指