青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Dragon  
Dragon
日歷
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011
統(tǒng)計(jì)
  • 隨筆 - 58
  • 文章 - 0
  • 評(píng)論 - 55
  • 引用 - 0

導(dǎo)航

常用鏈接

留言簿(3)

隨筆分類(58)

隨筆檔案(58)

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

 
/*
 *Base64Coder.h
 
*/

#ifndef BASE64CODER_H
#define BASE64CODER_H

#include 
<string.h>

#ifdef   __BORLANDC__
#define Boolean bool
#define False false
#define True true
#else

typedef unsigned Boolean;
#ifndef False
const Boolean False = 0;
#endif
#ifndef True
const Boolean True = 1;
#endif

#endif

class Base64Coder
{
public:
    Base64Coder();
    
~Base64Coder();

    
char* Base64Encode(char const* origSigned, unsigned origLength);
    unsigned 
char* Base64Decode(char* in, unsigned& resultSize,Boolean trimTrailingZeros); 

private:
    Boolean haveInitedBase64DecodeTable;
    
void initBase64DecodeTable();
    
char* strDupSize(char const* str);
    
char base64DecodeTable[256];
    
char base64Char[64];
}
;
#endif
/*
 *Base64Coder.cpp
 
*/

#include 
"Base64Coder.h"

Base64Coder::Base64Coder()
{
    
int i,j=0;
    
for (i = 'A'; i <= 'Z'++i) base64Char[j++= i;
    
for (i = 'a'; i <= 'z'++i) base64Char[j++= i;
    
for (i = '0'; i <= '9'++i) base64Char[j++= i;
    base64Char[j
++= '+';
    base64Char[j
++= '/';

    haveInitedBase64DecodeTable
=False;
}


Base64Coder::
~Base64Coder()
{

}


void Base64Coder::initBase64DecodeTable()
{
    
int i;
    
for (i = 0; i < 256++i) base64DecodeTable[i] = (char)0x80;
    
// default value: invalid

    
for (i = 'A'; i <= 'Z'++i) base64DecodeTable[i] = 0 + (i - 'A');
    
for (i = 'a'; i <= 'z'++i) base64DecodeTable[i] = 26 + (i - 'a');
    
for (i = '0'; i <= '9'++i) base64DecodeTable[i] = 52 + (i - '0');
    base64DecodeTable[(unsigned 
char)'+'= 62;
    base64DecodeTable[(unsigned 
char)'/'= 63;
    base64DecodeTable[(unsigned 
char)'='= 0;
}


unsigned 
char* Base64Coder::Base64Decode(char* in, unsigned& resultSize,Boolean trimTrailingZeros) 
{
    
if (!haveInitedBase64DecodeTable) {
        initBase64DecodeTable();
        haveInitedBase64DecodeTable 
= True;
    }


    unsigned 
char* out = (unsigned char*)strDupSize(in); // ensures we have enough space
    int k = 0;
    
int const jMax = strlen(in- 3;
    
// in case "in" is not a multiple of 4 bytes (although it should be)
    for (int j = 0; j < jMax; j += 4{
        
char inTmp[4], outTmp[4];
        
for (int i = 0; i < 4++i) {
            inTmp[i] 
= in[i+j];
            outTmp[i] 
= base64DecodeTable[(unsigned char)inTmp[i]];
            
if ((outTmp[i]&0x80!= 0) outTmp[i] = 0// pretend the input was 'A'
        }


        
out[k++= (outTmp[0]<<2| (outTmp[1]>>4);
        
out[k++= (outTmp[1]<<4| (outTmp[2]>>2);
        
out[k++= (outTmp[2]<<6| outTmp[3];
    }


    
if (trimTrailingZeros) {
        
while (k > 0 && out[k-1== '\0'--k;
    }

    resultSize 
= k;
    unsigned 
char* result = new unsigned char[resultSize];
    memmove(result, 
out, resultSize);
    delete[] 
out;

    
return result;
}


char* Base64Coder::Base64Encode(char const* origSigned, unsigned origLength) 
{
    unsigned 
char const* orig = (unsigned char const*)origSigned; // in case any input bytes have the MSB set
    if (orig == NULL) return NULL;

    unsigned 
const numOrig24BitValues = origLength/3;
    Boolean havePadding 
= origLength > numOrig24BitValues*3;
    Boolean havePadding2 
= origLength == numOrig24BitValues*3 + 2;
    unsigned 
const numResultBytes = 4*(numOrig24BitValues + havePadding);
    
char* result = new char[numResultBytes+1]; // allow for trailing '\0'

    
// Map each full group of 3 input bytes into 4 output base-64 characters:
    unsigned i;
    
for (i = 0; i < numOrig24BitValues; ++i) {
        result[
4*i+0= base64Char[(orig[3*i]>>2)&0x3F];
        result[
4*i+1= base64Char[(((orig[3*i]&0x3)<<4| (orig[3*i+1]>>4))&0x3F];
        result[
4*i+2= base64Char[((orig[3*i+1]<<2| (orig[3*i+2]>>6))&0x3F];
        result[
4*i+3= base64Char[orig[3*i+2]&0x3F];
    }


    
// Now, take padding into account.  (Note: i == numOrig24BitValues)
    if (havePadding) {
        result[
4*i+0= base64Char[(orig[3*i]>>2)&0x3F];
        
if (havePadding2) {
            result[
4*i+1= base64Char[(((orig[3*i]&0x3)<<4| (orig[3*i+1]>>4))&0x3F];
            result[
4*i+2= base64Char[(orig[3*i+1]<<2)&0x3F];
        }
 else {
            result[
4*i+1= base64Char[((orig[3*i]&0x3)<<4)&0x3F];
            result[
4*i+2= '=';
        }

        result[
4*i+3= '=';
    }


    result[numResultBytes] 
= '\0';
    
return result;
}


char* Base64Coder::strDupSize(char const* str) 
{
    
if (str == NULL) return NULL;
    
int len = strlen(str) + 1;
    
char* copy = new char[len];

    
return copy;
}

下面是測(cè)試程序:
/*
 *main.cpp
 
*/

#include 
"Base64Coder.h"

#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))

int main(void)
{
    
int i;
    Base64Coder 
* p_Base64Coder=new Base64Coder();
    
struct test {
        unsigned 
char *data;
        
char *encoded_ref;
    }
 tests[] = {
        
{(unsigned char*)"",        ""},
        
{(unsigned char*)"1",       "MQ=="},
        
{(unsigned char*)"22",      "MjI="},
        
{(unsigned char*)"333",     "MzMz"},
        
{(unsigned char*)"4444",    "NDQ0NA=="},
        
{(unsigned char*)"55555",   "NTU1NTU="},
        
{(unsigned char*)"666666",  "NjY2NjY2"},
        
{(unsigned char*)"abc:def""YWJjOmRlZg=="},
    }
;

    printf(
"Encoding/decoding tests\n");
    
for (i = 0; i < FF_ARRAY_ELEMS(tests); i++)
    
{
        unsigned 
char * res;
        unsigned length;
        res
=p_Base64Coder->Base64Decode(tests[i].encoded_ref,length,True);
        
if (strcmp((char *)res,(char *)tests[i].data)!=0)
        
{
            printf(
"Passed!  ");
        }

        
else
        
{
            printf(
"Failed!  ");
        }

        
for (int j=0;j<length;j++)
        
{
            printf(
"%c",res[j]);
        }

        printf(
" Length:%d\n",length);
        printf(
"\n");
    }

    
return 0;
}

開(kāi)始時(shí)不小心,以為ffmpeg的Base64解碼不正確,就用了Live555的,后來(lái)發(fā)現(xiàn)ffmpeg的其實(shí)也是正確的。
Live555的Decode函數(shù)最后的參數(shù)trimTrailingZeros設(shè)置成True就和ffmpeg的Base64一樣了,意為將尾部的0去掉。
可以將上面測(cè)試程序中的True改成False,然后看打印出來(lái)的結(jié)果就明白了(打印的尾部0是看不到的)。
posted on 2010-12-14 14:10 Dragon 閱讀(1455) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++
 
Copyright © Dragon Powered by: 博客園 模板提供:滬江博客
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品对白刺激久久久| 另类综合日韩欧美亚洲| 国产精品一区二区三区久久久 | 欧美呦呦网站| 先锋影音久久| 久久久久久久999精品视频| 欧美一区二区三区的| 久久精品女人的天堂av| 暖暖成人免费视频| 欧美日韩国产不卡在线看| 欧美三区美女| 国产欧美一区二区色老头| 黑人操亚洲美女惩罚| 亚洲国产精品一区二区第四页av | 妖精视频成人观看www| 中文欧美在线视频| 久久成年人视频| 欧美激情精品久久久久久久变态| 欧美日韩综合久久| 国产日韩在线一区二区三区| 在线日韩中文| 午夜精品在线视频| 欧美成人精品不卡视频在线观看| 亚洲人精品午夜在线观看| 亚洲毛片在线| 欧美亚洲专区| 欧美伦理a级免费电影| 国产一区二区三区在线观看免费 | 欧美激情视频在线播放| 一个色综合av| 免费在线亚洲| 国产欧美日韩在线| 日韩视频一区二区三区在线播放免费观看 | 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲大胆人体视频| 午夜欧美大片免费观看| 欧美大片在线观看一区| 国产色婷婷国产综合在线理论片a| 91久久精品日日躁夜夜躁国产| 欧美一级精品大片| 亚洲另类在线视频| 蜜桃久久av一区| 国内精品久久久久久久影视麻豆| 一区二区日韩免费看| 免费日韩视频| 欧美资源在线| 国产精品午夜视频| 中国日韩欧美久久久久久久久| 欧美mv日韩mv亚洲| 久久精品日韩一区二区三区| 国产精品一区二区你懂得| 99热精品在线观看| 亚洲第一天堂无码专区| 久久av资源网| 国产在线精品二区| 久久精品国产精品| 午夜一级久久| 国产情人节一区| 亚洲欧美日韩在线不卡| 中文av字幕一区| 国产精品一区二区三区乱码| 亚洲欧美日韩中文播放| 亚洲一区二区四区| 国产精品入口福利| 欧美在线亚洲在线| 欧美亚洲视频在线看网址| 国产一区二区三区的电影| 噜噜噜91成人网| 男女精品网站| 亚洲免费av网站| 亚洲六月丁香色婷婷综合久久| 欧美日韩福利视频| 亚洲永久免费精品| 亚洲免费在线观看| 国产一区二区高清| 男女激情视频一区| 欧美精品xxxxbbbb| 亚洲欧美日韩国产综合精品二区| 亚洲综合第一| 欲色影视综合吧| 亚洲欧洲视频在线| 国产精品视频免费观看www| 久久福利电影| 欧美不卡福利| 亚洲在线国产日韩欧美| 欧美中文在线免费| 一区二区三区精品在线| 亚洲——在线| 亚洲第一福利在线观看| 亚洲精品视频在线观看免费| 国产精品免费观看视频| 久久婷婷一区| 欧美日韩高清在线播放| 久久精品国亚洲| 99在线精品视频| 国产欧美精品一区二区三区介绍| 免费看亚洲片| 国产精品嫩草99av在线| 欧美第一黄色网| 国产精品久久久久久久免费软件| 久久全球大尺度高清视频| 欧美激情亚洲综合一区| 欧美精品一区二区三区久久久竹菊 | 亚洲人成在线播放网站岛国| 国产精品一区二区在线观看网站| 美女精品自拍一二三四| 欧美视频一区二区三区| 六月婷婷一区| 国产欧美一二三区| 99国产欧美久久久精品| 亚洲国产精品久久久久婷婷老年| 亚洲欧美另类中文字幕| 99人久久精品视频最新地址| 久久精品国产精品亚洲综合| 亚洲午夜一区二区| 美女视频网站黄色亚洲| 久久成年人视频| 欧美紧缚bdsm在线视频| 久久综合色一综合色88| 国产精品欧美精品| 一级日韩一区在线观看| 99在线观看免费视频精品观看| 久久蜜臀精品av| 久久久久久97三级| 国产欧美一区二区精品性| 亚洲一区二区不卡免费| 夜夜嗨av一区二区三区四季av| 久久中文精品| 免费看亚洲片| 亚洲经典在线| 欧美va天堂va视频va在线| 欧美国产精品一区| 在线 亚洲欧美在线综合一区| 亚洲免费一级电影| 久久精品国产99国产精品澳门| 国产乱肥老妇国产一区二| 中日韩视频在线观看| 亚洲欧美国产不卡| 国产精品美女久久久久久久| 亚洲一卡久久| 欧美中文字幕在线视频| 国产日韩欧美二区| 亚欧成人在线| 久久永久免费| 亚洲电影毛片| 欧美精品久久99| 一区二区av| 久久成人亚洲| 永久免费精品影视网站| 久久久激情视频| 亚洲高清成人| 亚洲影院高清在线| 国产亚洲欧美另类中文| 久久久女女女女999久久| 欧美国产视频在线观看| 日韩视频在线观看| 国产精品伦子伦免费视频| 亚洲直播在线一区| 樱花yy私人影院亚洲| 另类春色校园亚洲| 日韩视频在线一区二区三区| 亚洲一区精品在线| 国产色综合久久| 欧美激情精品久久久久久黑人| 一区二区成人精品| 久久久精品视频成人| 亚洲人体一区| 欧美午夜电影一区| 久久精品人人做人人综合| 亚洲精品国久久99热| 亚洲欧美视频在线| 亚洲成在人线av| 国产精品成人播放| 久久九九久精品国产免费直播| 欧美96在线丨欧| 亚洲欧美日韩国产一区二区| 亚洲第一福利在线观看| 欧美视频一区二区三区四区| 久久久av网站| 在线亚洲自拍| 欧美成人影音| 久久激情视频免费观看| 99精品久久免费看蜜臀剧情介绍| 国产亚洲精品久久久久动| 欧美欧美在线| 久久精品国产一区二区三区免费看| 亚洲激情六月丁香| 久久夜色精品国产欧美乱| 亚洲中午字幕| 亚洲精选大片| 在线日韩中文| 国语自产精品视频在线看| 国产精品二区二区三区| 欧美顶级大胆免费视频| 久久国产精品99精品国产| 亚洲宅男天堂在线观看无病毒| 99精品视频免费观看| 91久久精品视频| 欧美激情国产精品| 免费欧美视频|