base64解码

  网络传输经常用base64编码的数据,因此我们需要将其解码成正常字符集合。

  base64.h

 1 #ifdef  __cplusplus
 2 extern "C" {
 3 #endif
 4 
 5 char * base64_encode( const unsigned char * bindata, char * base64, int binlength );
 6 int base64_decode( const char * base64, unsigned char * bindata );
 7 
 8 #ifdef  __cplusplus
 9 }
10 #endif

  base64.c

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include "base64.h"
 5 
 6 #ifndef MAX_PATH
 7 #define MAX_PATH 256
 8 #endif
 9 
10 const char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
11 
12 char * base64_encode( const unsigned char * bindata, char * base64, int binlength )
13 {
14     int i, j;
15     unsigned char current;
16 
17     for ( i = 0, j = 0 ; i < binlength ; i += 3 )
18     {
19         current = (bindata[i] >> 2) ;
20         current &= (unsigned char)0x3F;
21         base64[j++] = base64char[(int)current];
22 
23         current = ( (unsigned char)(bindata[i] << 4 ) ) & ( (unsigned char)0x30 ) ;
24         if ( i + 1 >= binlength )
25         {
26             base64[j++] = base64char[(int)current];
27             base64[j++] = '=';
28             base64[j++] = '=';
29             break;
30         }
31         current |= ( (unsigned char)(bindata[i+1] >> 4) ) & ( (unsigned char) 0x0F );
32         base64[j++] = base64char[(int)current];
33 
34         current = ( (unsigned char)(bindata[i+1] << 2) ) & ( (unsigned char)0x3C ) ;
35         if ( i + 2 >= binlength )
36         {
37             base64[j++] = base64char[(int)current];
38             base64[j++] = '=';
39             break;
40         }
41         current |= ( (unsigned char)(bindata[i+2] >> 6) ) & ( (unsigned char) 0x03 );
42         base64[j++] = base64char[(int)current];
43 
44         current = ( (unsigned char)bindata[i+2] ) & ( (unsigned char)0x3F ) ;
45         base64[j++] = base64char[(int)current];
46     }
47     base64[j] = '';
48     return base64;
49 }
50 
51 int base64_decode( const char * base64, unsigned char * bindata )
52 {
53     int i, j;
54     unsigned char k;
55     unsigned char temp[4];
56     for ( i = 0, j = 0; base64[i] != '' ; i += 4 )
57     {
58         memset( temp, 0xFF, sizeof(temp) );
59         for ( k = 0 ; k < 64 ; k ++ )
60         {
61             if ( base64char[k] == base64[i] )
62                 temp[0]= k;
63         }
64         for ( k = 0 ; k < 64 ; k ++ )
65         {
66             if ( base64char[k] == base64[i+1] )
67                 temp[1]= k;
68         }
69         for ( k = 0 ; k < 64 ; k ++ )
70         {
71             if ( base64char[k] == base64[i+2] )
72                 temp[2]= k;
73         }
74         for ( k = 0 ; k < 64 ; k ++ )
75         {
76             if ( base64char[k] == base64[i+3] )
77                 temp[3]= k;
78         }
79 
80         bindata[j++] = ((unsigned char)(((unsigned char)(temp[0] << 2))&0xFC)) |
81                 ((unsigned char)((unsigned char)(temp[1]>>4)&0x03));
82         if ( base64[i+2] == '=' )
83             break;
84 
85         bindata[j++] = ((unsigned char)(((unsigned char)(temp[1] << 4))&0xF0)) |
86                 ((unsigned char)((unsigned char)(temp[2]>>2)&0x0F));
87         if ( base64[i+3] == '=' )
88             break;
89 
90         bindata[j++] = ((unsigned char)(((unsigned char)(temp[2] << 6))&0xF0)) |
91                 ((unsigned char)(temp[3]&0x3F));
92     }
93     return j;
94 }
原文地址:https://www.cnblogs.com/guoxiaoqian/p/3915382.html