一、最近,在做一個智能鎖項目,鎖上具有一個貓眼攝像頭,當有客人來訪時,需要通過貓眼抓拍圖片上傳到手機app端,讓主人知道來訪者是誰,項目中使用到了Base64編解碼技術,所謂Base64編解碼就是把每三個8bit的字節轉換爲四個6bit的字節(3*8 = 4*6 = 24),然後把6bit的字節再添兩位高位0,組成四個8bit的字節,也就是說,轉換後的字符串理論上將要比原來的長1/3。例如:
轉換前 11111111, 11111111, 11111111 (二進制)
轉換後 00111111, 00111111, 00111111, 00111111 (二進制)
上面的三個字節是原文,下面的四個字節是轉換後的Base64編碼,其前兩位均爲0。Base64編碼是使用64個可打印ASCII字符(A-Z、a-z、0-9、+、/)將任意字節序列數據編碼成ASCII字符串,另有“=”符號用作後綴用途。 其中索引表如下圖所示:
二、代碼部分
Base64編碼
const char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
char * base64_encode( const unsigned char * originChar, char * base64, int originlength )//base64編碼
{
int i, j;
unsigned char current;
for ( i = 0, j = 0 ; i < originlength ; i += 3 )
{
current = (originChar[i] >> 2) ;
current &= (unsigned char)0x3F;
base64[j++] = base64char[(int)current];
current = ( (unsigned char)(originChar[i] << 4 ) ) & ( (unsigned char)0x30 ) ;
if ( i + 1 >= originlength )
{
base64[j++] = base64char[(int)current];
base64[j++] = '=';
base64[j++] = '=';
break;
}
current |= ( (unsigned char)(originChar[i+1] >> 4) ) & ( (unsigned char) 0x0F );
base64[j++] = base64char[(int)current];
current = ( (unsigned char)(originChar[i+1] << 2) ) & ( (unsigned char)0x3C ) ;
if ( i + 2 >= originlength )
{
base64[j++] = base64char[(int)current];
base64[j++] = '=';
break;
}
current |= ( (unsigned char)(originChar[i+2] >> 6) ) & ( (unsigned char) 0x03 );
base64[j++] = base64char[(int)current];
current = ( (unsigned char)originChar[i+2] ) & ( (unsigned char)0x3F ) ;
base64[j++] = base64char[(int)current];
}
base64[j] = '\0';
return base64;
}
Base64解碼部分
int base64_decode( const char * base64, unsigned char * originChar )//base64解碼
{
int i, j;
unsigned char k;
unsigned char temp[4];
for ( i = 0, j = 0; base64[i] != '\0' ; i += 4 )
{
memset( temp, 0xFF, sizeof(temp) );
for ( k = 0 ; k < 64 ; k ++ )
{
if ( base64char[k] == base64[i] )
temp[0]= k;
}
for ( k = 0 ; k < 64 ; k ++ )
{
if ( base64char[k] == base64[i+1] )
temp[1]= k;
}
for ( k = 0 ; k < 64 ; k ++ )
{
if ( base64char[k] == base64[i+2] )
temp[2]= k;
}
for ( k = 0 ; k < 64 ; k ++ )
{
if ( base64char[k] == base64[i+3] )
temp[3]= k;
}
originChar[j++] = ((unsigned char)(((unsigned char)(temp[0] << 2))&0xFC)) |
((unsigned char)((unsigned char)(temp[1]>>4)&0x03));
if ( base64[i+2] == '=' )
break;
originChar[j++] = ((unsigned char)(((unsigned char)(temp[1] << 4))&0xF0)) |
((unsigned char)((unsigned char)(temp[2]>>2)&0x0F));
if ( base64[i+3] == '=' )
break;
originChar[j++] = ((unsigned char)(((unsigned char)(temp[2] << 6))&0xF0)) |
((unsigned char)(temp[3]&0x3F));
}
return j;
}
三、總結
Base64編碼其實就是將二進制轉成字符串,Base64解碼其實就是將字符串轉成二進制,文中順便也提供瞭解碼代碼方便大家調用與交流,好了,最後提供兩個編解碼在線工具鏈接好方便大家論證:
http://tool.chinaz.com/tools/imgtobase