網絡上傳輸8bit信息最常用的傳輸方式就是base64,它通過查找表的方式,將一種基於64(2^6)個可打印字符來表示二進制數據;也就是說將任何要傳遞的信息轉換爲由A-Z,a-z,0-9,+/構成的64個字符中的一部分;
如現在有ABD三個字符,那麼如何將這三個字符轉換爲base64編碼的方式呢,如下圖所示:
從圖上可以看出,編碼方式由原來的8bit轉換爲6bit,然後每一6bit前面補齊2個bit(00)構成新的8bit,最後就由原來的3字節變成了4字節;
如果字符串的字節數不是3的整數倍,則在後面多餘的用“=”來補充;如上圖的例子中假如爲ABD1,則可以先補充2個0,構成ABD100,這個時候變成了6個字節,能被3整除,在進行編碼時候,後面多餘出的可以用“=”來表示。
代碼如下:
#include<iostream>
using namespace std;
int ChangeCharToBase64(char* pBase64Result, const char* pSrc, int iLen)
{
static char szBase64Set[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int n = 0;
int iMoveStep = 2;
char temp;
int iIndex;
for (size_t i = 0; i < iLen; i++)
{
if (iMoveStep == 2)
{
iIndex = ((*pSrc) >> iMoveStep) & 0x3f;
}
else if(iMoveStep == 4)
{
iIndex = ((*pSrc) >> iMoveStep) & 0xf;
}
else if (iMoveStep == 6)
{
iIndex = ((*pSrc) >> iMoveStep) & 0x3;
}
iIndex += n;
*pBase64Result++ = szBase64Set[iIndex];
n = (*pSrc) << (6 - iMoveStep);
n = n&0x3f;
iMoveStep += 2;
if (iMoveStep == 8)
{
iIndex = (*pSrc) & 0x3f;
*pBase64Result++ = szBase64Set[iIndex];
n = 0;
iMoveStep = 2;
}
pSrc++;
}
if (n!=0)
{
*pBase64Result++ = szBase64Set[n];
}
if (iLen %3 == 1)
{
*pBase64Result++ = '=';
*pBase64Result = '=';
}
if (iLen % 3 == 2)
{
*pBase64Result = '=';
}
return 0;
}
void main()
{
char pBaseResult[1024];
int r = 'A';
char* pSrc = "ABD1";
ChangeCharToBase64(pBaseResult, pSrc, strlen(pSrc));
};
最後的base64編碼結果爲QUJEMQ==