//==================== 加密方法BASE64 ====================
//base64编/解码用的基础字符集
const char ws_base64char[] =
“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”;
/*******************************************************************************
* 名称: ws_base64_encode
* 功能: ascii编码为base64格式
* 参数:
* bindata: ascii字符串输入
* base64: base64字符串输出
* binlength: bindata的长度
* 返回: base64字符串长度
* 说明: 无
******************************************************************************/
int32_t ws_base64_encode(const uint8_t *bindata, char *base64, int32_t binlength)
{
int32_t i, j;
uint8_t current;
for (i = 0, j = 0; i < binlength; i += 3)
{
current = (bindata[i] >> 2);
current &= (uint8_t)0x3F;
base64[j++] = ws_base64char[(int32_t)current];
current = ((uint8_t)(bindata[i] << 4)) & ((uint8_t)0x30);
if (i + 1 >= binlength)
{
base64[j++] = ws_base64char[(int32_t)current];
base64[j++] = '=';
base64[j++] = '=';
break;
}
current |= ((uint8_t)(bindata[i + 1] >> 4)) & ((uint8_t)0x0F);
base64[j++] = ws_base64char[(int32_t)current];
current = ((uint8_t)(bindata[i + 1] << 2)) & ((uint8_t)0x3C);
if (i + 2 >= binlength)
{
base64[j++] = ws_base64char[(int32_t)current];
base64[j++] = '=';
break;
}
current |= ((uint8_t)(bindata[i + 2] >> 6)) & ((uint8_t)0x03);
base64[j++] = ws_base64char[(int32_t)current];
current = ((uint8_t)bindata[i + 2]) & ((uint8_t)0x3F);
base64[j++] = ws_base64char[(int32_t)current];
}
base64[j] = '\0';
return j;
}
/*******************************************************************************
* 名称: ws_base64_decode
* 功能: base64格式解码为ascii
* 参数:
* base64: base64字符串输入
* bindata: ascii字符串输出
* 返回: 解码出来的ascii字符串长度
* 说明: 无
******************************************************************************/
int32_t ws_base64_decode(const char *base64, uint8_t *bindata)
{
int32_t i, j;
uint8_t k;
uint8_t temp[4];
for (i = 0, j = 0; base64[i] != '\0'; i += 4)
{
memset(temp, 0xFF, sizeof(temp));
for (k = 0; k < 64; k++)
{
if (ws_base64char[k] == base64[i])
temp[0] = k;
}
for (k = 0; k < 64; k++)
{
if (ws_base64char[k] == base64[i + 1])
temp[1] = k;
}
for (k = 0; k < 64; k++)
{
if (ws_base64char[k] == base64[i + 2])
temp[2] = k;
}
for (k = 0; k < 64; k++)
{
if (ws_base64char[k] == base64[i + 3])
temp[3] = k;
}
bindata[j++] = ((uint8_t)(((uint8_t)(temp[0] << 2)) & 0xFC)) |
((uint8_t)((uint8_t)(temp[1] >> 4) & 0x03));
if (base64[i + 2] == '=')
break;
bindata[j++] = ((uint8_t)(((uint8_t)(temp[1] << 4)) & 0xF0)) |
((uint8_t)((uint8_t)(temp[2] >> 2) & 0x0F));
if (base64[i + 3] == '=')
break;
bindata[j++] = ((uint8_t)(((uint8_t)(temp[2] << 6)) & 0xF0)) |
((uint8_t)(temp[3] & 0x3F));
}
return j;
}
在线验证的:https://base64.us/