[lpc] base64 en/decode
2008-07-25 22:50:56| 分类:
lang_lpc
| 标签:
|举报
|字号大中小 订阅
:-) 自己弄了个 base64 的 lpc version, just for fun~~~
---------------------------
// 0 ~ 64
static string _V2C = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
string base64_encode(string str)
{
int count, len;
int a, b, c, d, e;
string cResult = "", cPostfix = "";
count = 0;
len = sizeof(str);
if ( (len % 3) == 2 )
{
a = (str[len-2] >> 2);
b = ((str[len-2] & 0x03) << 4) | (str[len-1] >> 4);
c = ((str[len-1] & 0x0f) << 2);
cPostfix = sprintf("%c%c%c=", _V2C[a], _V2C[b], _V2C[c]);
len -= 2;
}
else if ( (len % 3) == 1 )
{
a = (str[len-1] >> 2);
b = ((str[len-1] & 0x03) << 4);
cPostfix = sprintf("%c%c==", _V2C[a], _V2C[b]);
len -= 1;
}
while (count < len)
{
a = (str[count] >> 2);
b = ((str[count] & 0x03) << 4) | (str[count+1] >> 4);
c = ((str[count+1] & 0x0f) << 2) | (str[count+2] >> 6);
d = (str[count+2] & 0x3f);
cResult += sprintf("%c%c%c%c", _V2C[a], _V2C[b], _V2C[c], _V2C[d]);
count += 3;
}
return (cResult + cPostfix);
}
static mapping _C2V = ([ ]);
string base64_decode(string str)
{
int count, len;
int c1, c2, c3;
string cResult = "", cPostfix = "";
count = 0;
len = sizeof(str);
if ( str[len-2..<-1] == "==" )
{
c1 = (_C2V[str[len-4]] << 2) | ((_C2V[str[len-3]] & 0x30) >> 4);
cPostfix = sprintf("%c", c1);
len -= 4;
}
else if ( str[len-1] == '=' )
{
c1 = (_C2V[str[len-4]] << 2) | ((_C2V[str[len-3]] & 0x30) >> 4);
c2 = ((_C2V[str[len-3]] & 0x0f) << 4) | ((_C2V[str[len-2]] & 0x3c) >> 2);
cPostfix = sprintf("%c%c", c1, c2);
len -= 4;
}
while (count < len)
{
c1 = (_C2V[str[count]] << 2) | ((_C2V[str[count+1]] & 0x30) >> 4);
c2 = ((_C2V[str[count+1]] & 0x0f) << 4) | ((_C2V[str[count+2]] & 0x3c) >> 2);
c3 = ((_C2V[str[count+2]] & 0x03) << 6) | (_C2V[str[count+3]] & 0x3f);
cResult += sprintf("%c%c%c", c1, c2, c3);
count += 4;
}
return (cResult + cPostfix);
}
void create()
{
int i;
for ( i = 0; i < sizeof(_V2C); i++ )
{
_C2V[ _V2C[i] ] = i;
}
}
评论这张
转发至微博
转发至微博
评论