1. 程式人生 > >C++ 實現圖片base64編解碼

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的才是二進位制字串。(也就是剛好反過來了) 這裡的二進位制字串:指