110,536
社区成员
发帖
与我相关
我的任务
分享
unsafe void EncodeBase64MSG(char* Src, int Src_len, char* base64code)
{
int len, i, work_Len;
byte* psrc;
byte Beign;
byte rest;
char[] szBase64TableOld2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".ToArray(); //$ 标准
char[] szBase64TableOld = {'P','Q','R','S','T','U','a','b','c','d','e','f','g','h','A','B','C','D','E','K','L','M','y','z',
'0','1','N','O','V','W','X','Y','Z','i','j','k','q','r','s','5','6','7','8','9','t','u','v','w',
'x','2','3','4','+','/','F','G','H','I','J','l','m','n','o','p'}; //- * 变化
char[] szBase64Table = {'P','Q','R','S','T','U','a','b','c','d','e','f','g','h','A','B','C','D','E','K','L','M','y','z',
'0','1','N','O','V','W','X','Y','Z','i','j','k','q','r','s','5','6','7','8','9','t','u','v','w',
'x','2','3','4','+','/','F','G','H','I','J','l','m','n','o','p'}; //- * 变化
work_Len = Src_len;
if (Src[4] == '-' || Src[4] == '*' || Src[4] == '$')
{
psrc = (byte*)&Src[5]; work_Len = work_Len - 5;
*base64code = Src[0]; base64code++;
*base64code = Src[1]; base64code++;
*base64code = Src[2]; base64code++;
*base64code = Src[3]; base64code++;
*base64code = Src[4]; base64code++;
i = Convert.ToInt32(Src[0]) % 63;
if (i != 0)
{
if (Src[4] == '$')
{
Buffer.BlockCopy(szBase64TableOld2, i, szBase64Table, 0, 64 - i);
Buffer.BlockCopy(szBase64TableOld2, 0, szBase64Table, 64 - i, i);
}
else
{
Buffer.BlockCopy(szBase64TableOld, i, szBase64Table, 0, 64 - i);
Buffer.BlockCopy(szBase64TableOld, 0, szBase64Table, 64 - i, i);
}
}
if (Src[4] == '*')
{
char[] buf = new char[3]; buf[2] = '\0';
len = 1; psrc++;
for (i = 1; i < work_Len; i = i + 2)
{
buf[0] = Src[5 + i];
buf[1] = Src[5 + i + 1];
*psrc = Convert.ToByte(buf[0].ToString() + buf[1].ToString(), 16);
psrc++;
len++;
}
psrc = (byte*)&Src[5];
work_Len = len;
}
}
else
psrc = (byte*)Src;
rest = 0;
Beign = 0;
len = 0;
for (i = 0; i < work_Len; i++)
{
do
{
*base64code = szBase64Table[(Beign << (6 - rest) | *psrc >> (2 + rest)) & 0x3f];
base64code++;
len++;
Beign = *psrc;
rest += 2;
if (rest == 8)
{
rest = 0;
}
} while (rest >= 6);
psrc++;
}
if (rest != 0)
{
*base64code = szBase64Table[(Beign << (6 - rest)) & 0x3f];
base64code++;
len++;
}
if (((len / 4) * 4) != len)
for (i = 0; i < ((len / 4) + 1) * 4 - len; i++)
{
*base64code = '=';
base64code++;
}
*base64code = '\0';
}