Base64編碼和解碼

來源:互聯網
上載者:User

標籤:

Base64這是一個二進位編碼方法轉換成可列印字元。主要用於郵件傳輸。

Base64將64人物(A-Z,a-z,0-9,+,/)由於基底字元集。把所有的符號轉換成字元集。

編碼:
編碼每次3節轉為4位元組。若輸入位元組數不是3的倍數。則在末尾填充0位元組使其長度為3的倍數。

對於3位元組。每次取出6位,並在前面加入2位0構成一個位元組。以此位元組為下標尋找Base64碼錶(例如以)輸出相應字元。

每次將3位元組轉為4位元組(3*8=4*6),直至得到整個輸入串的編碼結果。最後,若之前在輸入中加入了1個0位元組,則將輸出結果最後1位元組替換成“=”,若加入了2個0位元組,則將輸出結果最後2位元組替換成“=”。
解碼:
Base64解碼就是編碼的逆過程,要注意解碼時每一個位元組的前2位0是人為填充的。後6位才是有效位。每次將4位元組中的24位有效位提取出來構成3位元組就可以。



編碼解碼過程的核心就是位操作。

              

                                                                            Base64碼錶

代碼:

#include<stdio.h>#include<stdlib.h>#include<string.h>const char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int findindex(char c){for(int i=0;i<64;i++){if(c==table[i])return i;}return -1;}void base64enc(const char*src,char*&dst){int slen=strlen(src);int len=slen;if(len%3!=0)len=(len/3+1)*3;//長度湊成3的倍數unsigned char*s=(unsigned char*)malloc(len*sizeof(unsigned char));//此處使用unsigned char,否則無法處理中文輸入memset(s,0,len);memcpy(s,src,slen);int dlen=(len/3)*4+1;dst=(char*)malloc(dlen*sizeof(char));for(int i=0,j=0;i<len;i+=3){//核心步驟//**************************************dst[j]=table[s[i]>>2];dst[j+1]=table[((s[i]&0X03)<<4)|(s[i+1]>>4)];dst[j+2]=table[((s[i+1]&0X0F)<<2)|(s[i+2]>>6)];dst[j+3]=table[s[i+2]&0X3F];//**************************************j+=4;}free(s);if(slen%3==1)dst[dlen-2]=dst[dlen-3]='=';if(slen%3==2)dst[dlen-2]='=';dst[dlen-1]=0;}void base64dec(const char*src,char*&dst){int slen=strlen(src);if(slen%4!=0)return ;int dlen=(slen/4)*3+1;char*d=(char*)malloc(dlen*sizeof(char));int index[4];for(int i=0,j=0;i<slen;i+=4){for(int k=0;k<4;k++){index[k]=findindex(src[i+k]);}//核心步驟//**************************************d[j]=index[0]<<2|index[1]>>4;d[j+1]=index[1]<<4|index[2]>>2;d[j+2]=index[2]<<6|index[3];//**************************************j+=3;}//去除src尾部'='的影響if(src[slen-1]=='='&&src[slen]!='=')dlen-=1;if(src[slen-1]=='='&&src[slen]=='=')dlen-=2;dst=(char*)malloc(dlen*sizeof(char));memcpy(dst,d,dlen);free(d);dst[dlen-1]=0;}int main(){char src[]="Hello,小羅";char*enc,*dec;base64enc(src,enc);base64dec(enc,dec);printf("%s\n",src);printf("%s\n",enc);printf("%s\n",dec);free(enc);free(dec);return 0;}



著作權聲明:本文博主原創文章,部落格,未經同意不得轉載。

Base64編碼和解碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.