php base64 原理

#include <stdio.h>
#include <stdlib.h>
#include <string.h> static const char base64_table[] ={
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'', '', '', '', '', '', '', '', '', '', '+', '/', '\0'
}; unsigned char *base64_encode(const unsigned char *str)
{
static const char base64_pad = '=';
const unsigned char *current = str;
int length = strlen(str);
unsigned char *p, *result; //检测 result = (unsigned char *)malloc(((length + ) / ) * * sizeof(char) + );
p = result; while(length > ){
*p++ = base64_table[current[] >> ];
*p++ = base64_table[((current[] & 0x03) << ) + (current[] >> )];
*p++ = base64_table[((current[] & 0x0f) << ) + (current[] >> )];
*p++ = base64_table[current[] & 0x3f]; current += ;
length -= ;
} if(length == ){
*p++ = base64_table[current[] >> ];
*p++ = base64_table[((current[] & 0x03) << ) + (current[] >> )];
*p++ = base64_table[(current[] & 0x0f) << ];
*p++ = base64_pad;
}else if(length == ){
*p++ = base64_table[current[] >> ];
*p++ = base64_table[(current[] & 0x03) << ];
*p++ = base64_pad;
*p++ = base64_pad;
} *p = '\0';
return result;
} static int base64_decode_map[] = {
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, // 0 - 15
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, // 16 - 31
-, -, -, -, -, -, -, -, -, -, -, , -, -, -, , // 32 - 47
, , , , , , , , , , -, -, -, -, -, -, // 48 - 63
-, , , , , , , , , , , , , , , , // 64 - 79
, , , , , , , , , , , -, -, -, -, -, // 80 - 95
-, , , , , , , , , , , , , , , , // 96 - 111
, , , , , , , , , , , -, -, -, -, -, // 112 - 127
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, // 128 - 143
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, // 144 - 159
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, // 160 - 175
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, // 176 - 191
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, // 192 - 207
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, // 208 - 223
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, // 224 - 239
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, // 240 - 255
}; char *base64_decode(const char *input, char *output)
{
output[] = '\0'; int input_len = strlen(input);
if(input_len < || input_len % != ){
return output;
} char *p = (char *)input;
char *p_out = output;
char *p_end = (char *)input + input_len; for(; p < p_end; p += ){
*p_out++ = ((base64_decode_map[p[]] << ) & 0xFC) | ((base64_decode_map[p[]] >> ) & 0x03);
*p_out++ = ((base64_decode_map[p[]] << ) & 0xF0) | ((base64_decode_map[p[]] >> ) & 0x0F);
*p_out++ = ((base64_decode_map[p[]] << ) & 0xC0) | ((base64_decode_map[p[]]));
} if(*(input + input_len - ) == '='){
*(p_out - ) = '\0';
}else if(*(input + input_len - ) == '='){
*(p_out - ) = '\0';
} return output;
} int main(){
unsigned char *ps = "";
unsigned char *ret = base64_encode(ps);
char output[];
memset(output, , sizeof output);
base64_decode(ret, output);
printf("%s, %s\n", ret, output);
}
上一篇:bzoj 3851: 2048 dp优化


下一篇:Java WebService接口生成和调用 图文详解>【转】【待调整】