|
以前写的一个小程序.
- /*
- * 将二进制数据转换为ascii -- encodebase64
- * 将ascii转换为二进制数据 -- decodebase64
- * 使用base64编码
- * XZJ 2003.04.08
- */
- #include <stdio.h>
- #include <stdlib.h>
- char encodingTable [64] = {
- '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','1','2','3','4','5','6','7','8','9','+','/'
- };
- int encodebase64 (unsigned char htext[], unsigned char h64[],
- size_t htextlen ) {
- unsigned long ixtext;
- unsigned long lentext;
- unsigned long origsize;
- unsigned long ix;
- long ctremaining;
- unsigned char ch;
- unsigned char inbuf [3], outbuf [4];
- unsigned char *ph64;
- short i;
- short charsonline = 0, ctcopy;
- ixtext = ix=0;
- ph64=h64;
- lentext=htextlen;
- while (1) {
- ctremaining = lentext - ixtext;
- if (ctremaining <= 0)
- break;
- for (i = 0; i < 3; i++) {
- ix = ixtext + i;
- if (ix < lentext)
- inbuf[i]=htext[ix];
- else
- inbuf [i] = 0;
- } /*for*/
- outbuf [0] = (inbuf [0] & 0xFC) >> 2;
- outbuf [1] = ((inbuf [0] & 0x03) << 4) | ((inbuf [1] & 0xF0) >> 4);
- outbuf [2] = ((inbuf [1] & 0x0F) << 2) | ((inbuf [2] & 0xC0) >> 6);
- outbuf [3] = inbuf [2] & 0x3F;
- ctcopy = 4;
- switch (ctremaining) {
- case 1:
- ctcopy = 2;
- break;
- case 2:
- ctcopy = 3;
- break;
- } /*switch*/
- for (i = 0; i < ctcopy; i++)
- *ph64++=encodingTable[outbuf[i]];
- for (i = ctcopy; i < 4; i++)
- *ph64++='=';
- ixtext += 3;
- } /*while*/
- return (1);
- }
- int decodebase64 (unsigned char h64[], unsigned char htext[],size_t h64len) {
- unsigned long ixtext;
- unsigned long lentext;
- unsigned long origsize;
- unsigned long ctremaining;
- unsigned char ch;
- unsigned char inbuf [3], outbuf [4];
- short i, ixinbuf;
- unsigned char *phtext;
- int flignore;
- int flendtext = 0;
- ixtext = 0;
- lentext = h64len;
- ixinbuf = 0;
- phtext=htext;
- while (1) {
- if (ixtext >= lentext)
- break;
- ch=h64[ixtext++];
- flignore = 0;
- if ((ch >= 'A') && (ch <= 'Z'))
- ch = ch - 'A';
- else if ((ch >= 'a') && (ch <= 'z'))
- ch = ch - 'a' + 26;
- else if ((ch >= '0') && (ch <= '9'))
- ch = ch - '0' + 52;
- else if (ch == '+')
- ch = 62;
- else if (ch == '=') /*no op -- can't ignore this one*/
- flendtext = 1;
- else if (ch == '/')
- ch = 63;
- else
- flignore = 1;
- if (!flignore) {
- short ctcharsinbuf = 3;
- int flbreak = 0;
- if (flendtext) {
- if (ixinbuf == 0)
- break;
- if ((ixinbuf == 1) || (ixinbuf == 2))
- ctcharsinbuf = 1;
- else
- ctcharsinbuf = 2;
- ixinbuf = 3;
- flbreak = 1;
- }
- inbuf [ixinbuf++] = ch;
- if (ixinbuf == 4) { /*将读入的4个字节decode */
- ixinbuf = 0;
- outbuf [0] = (inbuf [0] << 2) | ((inbuf [1] & 0x30) >> 4);
- outbuf [1] = ((inbuf [1] & 0x0F) << 4) | ((inbuf [2] & 0x3C)
- >> 2);
- outbuf [2] = ((inbuf [2] & 0x03) << 6) | (inbuf [3] & 0x3F);
- for (i = 0; i < ctcharsinbuf; i++)
- *phtext++=outbuf[i];
- }
- if (flbreak)
- break;
- }
- } /*while*/
- exit:
- return (1);
- }
- /* for testing */
- #if 0
- int main(int argc,char *argv[])
- {
- unsigned char inbuf[7];
- unsigned char outbuf[32];
- int i;
- size_t inlen,outlen;
- inlen=sizeof(inbuf);
- outlen=sizeof(outbuf);
- memset(inbuf,0x0,inlen);
- memset(outbuf,0x0,outlen);
- printf("init value :\n");
- for(i=0;i<inlen;++i) inbuf[i]='x';
- for(i=0;i<inlen;++i)
- printf("%x ",inbuf[i]);
- printf("\n");
- printf("encoding ... \n");
- encodebase64(inbuf,outbuf,inlen);
- printf("%c ",outbuf[i]);
- printf("\n");
- decodebase64(outbuf,inbuf,outlen);
- printf("decode ...\n");
- for(i=0;i<inlen;++i)
- printf("%x ",inbuf[i]);
- printf("\n");
- return 0;
- }
- #endif
复制代码 |
|