首页
社区
课程
招聘
[原创]Base64编码解码算法 Cpp+sdk 源码
发表于: 2008-11-27 04:21 7202

[原创]Base64编码解码算法 Cpp+sdk 源码

2008-11-27 04:21
7202

偶是编程初学者,比较菜
为了学习这个Base64的编码解码算法,一直搞到现在凌晨4:20
大部位时间都花在 Debug上而了。

不过总算是弄出来了,我把它拿出来,也给大家看看,献丑了(那些大牛们可别笑哦! )...........
呵呵,希望对跟我一样还在入门的朋友有点帮助吧..


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个是邮件用的吧?
2008-11-27 11:08
0
雪    币: 267
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
[CODE][/CODE]
那是一个方面的应用.
我们常用下载软件的专用链(如迅雷,快车等)都是用 Base64进行编码的.
2008-11-27 16:04
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢了,虽然这样的代码很多。可是作为初学者能自己写点东西。然后分享,真的是不错的。
有时候想写点可是,总想找谢现成的代码。精神令我很佩服。
我想说的是,在一些软件注册码的使用上也可以使用BASE64编码,Base64编码还可用于在HTTP环境下传递较长的标识信息。
另外在一些不能以ASCII码显示的东西,都可以使用BASE64编码来编码传递。
例如如果我想给你一个小的可执行文件。那么没有空间可以放文件,但是可以在论坛里发帖子,
那么我用BASE64编码发帖子之后,你把这些代码复制之后,用BASE64再解码,就会得到这个可执行文件了。
呵呵,我想也许就我这么BT用这种方式传文件吧。
2008-11-27 21:01
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
这是我在第一次看BASE64编码规则后花1小时写的

/*
编码表
A B C D E F G H I J  K  L  M  N  O  P  Q
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

R   S  T  U  V  W  X  Y  Z  a  b  c  d  e  f  g  h
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

z  0  1  2  3  4  5  6  7  8  9  +  / (pad) =
51 52 53 54 55 56 57 58 59 60 61 62 63
*/
int Base64_Encode(char *Src, int SrcLength,  char *OutputBuffer, int OutputBufferLength)
{
        int GroupCount;
        int GroupResidualLength;
        int EncodeResultLength;
        int i;
        unsigned char *SrcData;
        unsigned char PaddingBuffer[3];
        static char Base64_EncodeTable[64]={"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"};

        /*将原始数据分为3个字节一组*/
        GroupCount = SrcLength / 3;
        GroupResidualLength = SrcLength % 3;
        EncodeResultLength = GroupCount * 4;
        if(0 != GroupResidualLength)
                EncodeResultLength = EncodeResultLength + 4;

        if(EncodeResultLength > OutputBufferLength)
        {
                /*输出缓冲区不足*/
                return 0;
        }

        /*编码分组*/
        SrcData = (unsigned char *)Src;
        for(i = 0; i < GroupCount; i++)
        {
                OutputBuffer[i*4 + 0]= Base64_EncodeTable[ ( SrcData[i*3 + 0]&0xFC )>>2 ];
                OutputBuffer[i*4 + 1]= Base64_EncodeTable[ ((SrcData[i*3 + 0]&0x03)<<4) + ((SrcData[i*3 + 1]&0xF0)>>4) ];
                OutputBuffer[i*4 + 2]= Base64_EncodeTable[ ((SrcData[i*3 + 1]&0x0F)<<2) + ((SrcData[i*3+ 2]&0xC0)>>6) ];
                OutputBuffer[i*4 + 3]= Base64_EncodeTable[ SrcData[i*3 + 2]&0x3F ];
        }

        /*编码未分组的剩余字节*/
        if(0 != GroupResidualLength)
        {
                PaddingBuffer[0] = 0;
                PaddingBuffer[1] = 0;
                PaddingBuffer[2] = 0;
                for(i = 0; i < GroupResidualLength; i++)
                        PaddingBuffer[i] = SrcData[GroupCount*3 + i];

                OutputBuffer[GroupCount*4 + 0]= Base64_EncodeTable[ ( PaddingBuffer[0]&0xFC )>>2 ];
                OutputBuffer[GroupCount*4 + 1]= Base64_EncodeTable[ ((PaddingBuffer[0]&0x03)<<4) + ((PaddingBuffer[1]&0xF0)>>4) ];
                OutputBuffer[GroupCount*4 + 2]= Base64_EncodeTable[ ((PaddingBuffer[1]&0x0F)<<2) + ((PaddingBuffer[2]&0xC0)>>6) ];
                OutputBuffer[GroupCount*4 + 3]= Base64_EncodeTable[ PaddingBuffer[2]&0x3F ];
        }
        return EncodeResultLength;
}

int Base64_Decode(char *Src, int SrcLength,  char *OutputBuffer, int OutputBufferLength)
{
        int GroupCount;
        int GroupResidualLength;
        int EncodeResultLength;
        int i,j;
        unsigned char *SrcData;
        unsigned char PaddingBuffer[4];
        unsigned char DecodeBuffer[4];
        static unsigned char Base64_DecodeTable[256] = {
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3F,
                0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
                0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
                0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
        };

        /*将原始数据分为4个字节一组*/
        GroupCount = SrcLength / 4;
        GroupResidualLength = SrcLength % 4;
        EncodeResultLength = GroupCount * 3;
        if(0 != GroupResidualLength)
                EncodeResultLength = EncodeResultLength + 3;

        /*解码分组*/
        SrcData = (unsigned char *)Src;
        for(i = 0; i < GroupCount; i++)
        {
                DecodeBuffer[0] = Base64_DecodeTable[ SrcData[i*4 + 0] ];
                DecodeBuffer[1] = Base64_DecodeTable[ SrcData[i*4 + 1] ];
                DecodeBuffer[2] = Base64_DecodeTable[ SrcData[i*4 + 2] ];
                DecodeBuffer[3] = Base64_DecodeTable[ SrcData[i*4 + 3] ];

                OutputBuffer[i*3 + 0]= (DecodeBuffer[0]<<2) | ((DecodeBuffer[1]&0x30)>>4);
                OutputBuffer[i*3 + 1]= ((DecodeBuffer[1]&0x0f)<<4) | ((DecodeBuffer[2]&0x3c)>>2);
                OutputBuffer[i*3 + 2]= ((DecodeBuffer[2]&0x03)<<6) | (DecodeBuffer[3]&0x3f);
        }

        /*解码未分组的剩余字节*/
        if(0 != GroupResidualLength)
        {
                PaddingBuffer[0] = '=';
                PaddingBuffer[1] = '=';
                PaddingBuffer[2] = '=';
                PaddingBuffer[3] = '=';

                for( i = 0; i < GroupResidualLength; i++ )
                {
                        PaddingBuffer[i] = SrcData[GroupCount*4 + i];
                }
                DecodeBuffer[0] = Base64_DecodeTable[ PaddingBuffer[0] ];
                DecodeBuffer[1] = Base64_DecodeTable[ PaddingBuffer[1] ];
                DecodeBuffer[2] = Base64_DecodeTable[ PaddingBuffer[2] ];
                DecodeBuffer[3] = Base64_DecodeTable[ PaddingBuffer[3] ];

                OutputBuffer[GroupCount*3 + 0]= (DecodeBuffer[0]<<2) | ((DecodeBuffer[1]&0x30)>>4);
                OutputBuffer[GroupCount*3 + 1]= ((DecodeBuffer[1]&0x0f)<<4) | ((DecodeBuffer[2]&0x3c)>>2);
                OutputBuffer[GroupCount*3 + 2]= ((DecodeBuffer[2]&0x03)<<6) | (DecodeBuffer[3]&0x3f);
        }
        return EncodeResultLength;
}
2008-11-27 21:20
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
————标准C
2008-11-27 21:21
0
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
剛上網搜了下:

在MIME格式的電子郵件中,base64可以用來將binary的位元組序列數據編碼成ASCII字元序列構成的文本。使用時,在傳輸編碼方式中指定base64。使用的字元包括大小寫字母各26個,加上10個數字,和加號「+」,斜杠「/」,一共64個字元,等號「=」用來作為後綴用途。

完整的base64定義可見 RFC1421和 RFC2045。編碼後的數據比原始數據略長,為原來的4/3。在電子郵件中,根據RFC822規定,每76個字元,還需要加上一個回車換行。可以估算編碼後數據長度大約為原長的135.1%。

轉換的時候,將三個byte的數據,先後放入一個24bit的緩衝區中,先來的byte占高位。數據不足3byte的話,於緩衝區中剩下的Bit用0補足。然後,每次取出6個bit,按照其值選擇ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字元作為編碼後的輸出。不斷進行,直到全部輸入數據轉換完成。

如果最後剩下兩個輸入數據,在編碼結果後加1個「=」;如果最後剩下一個輸入數據,編碼結果後加2個「=」;如果沒有剩下任何數據,就什麼都不要加,這樣才可以保證資料還原的正確性。

這裡有個例子:http://zh.wikipedia.org/wiki/Base64
2008-11-27 21:22
0
游客
登录 | 注册 方可回帖
返回
//