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

Dragon  
Dragon
日歷
<2010年12月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
統(tǒng)計(jì)
  • 隨筆 - 58
  • 文章 - 0
  • 評(píng)論 - 55
  • 引用 - 0

導(dǎo)航

常用鏈接

留言簿(3)

隨筆分類(lèi)(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 閱讀(1469) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 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>
            亚洲一区二区三| 国产精品一二三四| 免费成人在线视频网站| 久久都是精品| 亚久久调教视频| 午夜精品一区二区三区在线| 亚洲视频在线观看免费| 在线一区二区三区四区五区| 一区二区三区高清在线| 在线亚洲自拍| 久久免费精品视频| 欧美大片91| 欧美日韩精品免费在线观看视频| 欧美精品日韩三级| 欧美色中文字幕| 国产精品网站视频| 国产一区激情| 亚洲黄色av一区| 一区二区激情视频| 亚洲欧美制服另类日韩| 久久精品123| 欧美 日韩 国产精品免费观看| 欧美成人亚洲成人日韩成人| 亚洲激情一区| 欧美在线观看日本一区| 久久久久久久久岛国免费| 欧美a级一区二区| 亚洲专区一区| 久久综合国产精品| 欧美日韩免费在线| 国产麻豆91精品| 99国产精品久久久| 欧美在线一二三四区| 欧美不卡福利| 亚洲一区影音先锋| 欧美日韩福利视频| 亚洲精品国久久99热| 亚洲欧美日韩国产一区二区三区 | 亚洲黄色三级| 久久久女女女女999久久| 亚洲高清二区| 亚洲一区二三| 欧美日韩亚洲一区二区三区四区| 亚洲高清av在线| 亚洲免费伊人电影在线观看av| 亚洲国产精品一区二区第四页av | 亚洲一区二区免费| 欧美日韩久久不卡| 亚洲美女视频在线免费观看| 欧美一级成年大片在线观看| 欧美二区不卡| 久久艳片www.17c.com| 国产一区二区精品久久| av成人毛片| 久久精品一区二区三区不卡牛牛 | 欧美一区二区三区喷汁尤物| 99re在线精品| 欧美在线短视频| 欧美日韩精品在线观看| 日韩一区二区电影网| 亚洲国产影院| 欧美极品aⅴ影院| 亚洲毛片一区二区| 亚洲精品久久久久久久久久久久 | 一区二区三区我不卡| 亚洲私拍自拍| 欧美激情a∨在线视频播放| 亚洲在线视频| 国产精品中文字幕欧美| 销魂美女一区二区三区视频在线| 在线视频欧美日韩| 国产精品色网| 久久精品夜色噜噜亚洲a∨| 欧美一级久久久| 黄色av日韩| 性做久久久久久久免费看| 亚洲一区二区三区国产| 国产精品日日摸夜夜添夜夜av| 午夜精品一区二区三区在线| 亚洲直播在线一区| 国产亚洲一区在线| 免费欧美在线| 久久国产精品久久久久久| 极品少妇一区二区三区精品视频| 蜜臀a∨国产成人精品| 欧美va天堂| 又紧又大又爽精品一区二区| 久久国产精品久久久| 欧美中文字幕在线视频| 亚洲电影av在线| 久久五月天婷婷| 欧美一二三区在线观看| 一区二区在线观看视频在线观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美成人国产一区二区| 亚洲一区二区精品在线| 亚洲美洲欧洲综合国产一区| 国产精品国产亚洲精品看不卡15| 宅男在线国产精品| 亚洲自拍偷拍网址| 在线免费观看视频一区| 亚洲三级免费电影| 国产精自产拍久久久久久| 免费观看成人鲁鲁鲁鲁鲁视频 | 欧美日韩高清在线一区| 亚洲欧美日本另类| 久久免费的精品国产v∧| 99国产精品久久| 性久久久久久久久久久久| 亚洲国产日韩一级| 亚洲视频你懂的| 亚洲第一黄色| 在线一区日本视频| 影音先锋在线一区| 一区二区av| 在线成人激情| 亚洲天天影视| 亚洲国产精品一区二区www在线| 一本色道久久综合狠狠躁的推荐| 国产一区二区av| 亚洲人成啪啪网站| 国产综合网站| 99国产精品久久久久老师| 黑人巨大精品欧美一区二区小视频| 91久久国产精品91久久性色| 国产日韩欧美制服另类| 久久影院亚洲| 国产精品成人国产乱一区| 免费亚洲视频| 国产日韩欧美在线| 一本久久综合亚洲鲁鲁五月天| 精品88久久久久88久久久| 亚洲视频福利| 日韩一区二区福利| 久久这里有精品视频| 欧美一区二区三区四区在线观看地址 | 亚洲另类视频| 国产精品午夜春色av| 亚洲国产片色| 狠狠色综合播放一区二区| 亚洲视频在线一区| av成人福利| 免费观看亚洲视频大全| 久久精品女人| 国产精品日韩在线播放| 亚洲精品在线免费| 亚洲欧洲综合另类| 中日韩高清电影网| 99在线精品视频| 巨乳诱惑日韩免费av| 久久久xxx| 国产欧美日韩一区二区三区在线 | 日韩一区二区精品葵司在线| 国内外成人在线| 欧美一区二区免费| 国产在线精品二区| 亚洲午夜av| 亚洲一区二区三区三| 欧美伦理影院| 亚洲永久精品大片| 久久国产欧美日韩精品| 欧美在线二区| 国产精品一区二区三区四区| 一区二区三区免费网站| 亚洲视频免费看| 欧美日韩 国产精品| 亚洲日本免费| 9久re热视频在线精品| 欧美激情1区2区3区| 久久久久久久综合日本| 国产精品一区二区在线观看网站| 一区二区高清视频在线观看| 亚洲视频一区二区| 欧美激情综合亚洲一二区 | 女人香蕉久久**毛片精品| 国模私拍视频一区| 久久国内精品视频| 久久夜色精品国产亚洲aⅴ| 国精品一区二区| 久久久九九九九| 午夜国产精品影院在线观看| 欧美午夜久久久| 欧美第一黄网免费网站| 亚洲国产精品一区二区第一页 | 亚洲欧洲精品一区二区精品久久久| 亚洲国产乱码最新视频| 欧美成年视频| 亚洲老司机av| 午夜电影亚洲| 国产视频久久久久| 久久久国产亚洲精品| 欧美va天堂| 99re热这里只有精品视频| 欧美日韩色综合| 亚洲免费影视第一页| 久久精品亚洲| 亚洲国产成人av在线| 欧美精品九九99久久| 一区二区国产日产| 久久精品中文字幕一区|