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

Dragon  
Dragon
日歷
<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456
統(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 閱讀(1463) 評(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>
            欧美一区二区三区免费视| 久久久999| 欧美日韩国内| 亚洲国产精品第一区二区三区| 午夜精品久久久久久久久久久久| 欧美大片免费| 欧美中文字幕在线播放| 欧美视频在线视频| 99国产精品视频免费观看| 男人的天堂成人在线| 久久成人精品视频| 国产日韩欧美日韩大片| 亚洲欧美日韩国产综合| 99精品久久久| 欧美日本不卡视频| 亚洲精品一区二区三| 欧美国产激情二区三区| 久久免费99精品久久久久久| 韩国v欧美v日本v亚洲v| 久久激情五月丁香伊人| 亚洲欧美成人一区二区在线电影 | 亚洲精品美女在线| 老司机精品久久| 在线精品福利| 嫩模写真一区二区三区三州| 久久久福利视频| 韩国久久久久| 乱人伦精品视频在线观看| 欧美一区二区三区久久精品茉莉花 | 国产日韩欧美综合在线| 性欧美1819sex性高清| 一区二区三区国产在线| 国产精品久久久久av| 亚洲欧洲av一区二区三区久久| 在线一区二区三区四区| 国产精品豆花视频| 亚洲欧美一区二区三区在线| 中文av一区二区| 国产精品欧美久久| 欧美在线看片a免费观看| 午夜精品久久久久| 韩国福利一区| 欧美成人自拍视频| 欧美国产一区二区在线观看| 亚洲伦理在线免费看| 亚洲精品久久久久久久久久久久| 欧美日韩国语| 午夜精品www| 欧美在线观看日本一区| 一区二区在线免费观看| 欧美国产精品专区| 欧美乱人伦中文字幕在线| 亚洲午夜极品| 欧美亚洲三区| 亚洲国产第一| 日韩视频免费大全中文字幕| 国产精品久久久久一区二区三区共| 欧美一级黄色网| 久久久精品国产99久久精品芒果| 亚洲国产日韩一区| 亚洲理论在线| 国产色爱av资源综合区| 欧美成人精品福利| 欧美日韩国产综合视频在线| 欧美伊人影院| 另类成人小视频在线| 在线亚洲精品| 欧美一区二区在线播放| 最新中文字幕一区二区三区| 日韩网站在线观看| 国产一区二区三区精品欧美日韩一区二区三区 | 国产三级欧美三级| 欧美好骚综合网| 国产精品国产精品| 老司机精品久久| 欧美日韩不卡一区| 久久精品最新地址| 欧美精品18+| 久久国产精品网站| 欧美高清在线观看| 欧美一区亚洲二区| 麻豆亚洲精品| 午夜精品久久久久久久| 久久亚洲欧洲| 亚洲一区激情| 狂野欧美一区| 香蕉久久国产| 男人的天堂亚洲在线| 性色av一区二区三区在线观看| 美女主播精品视频一二三四| 亚洲欧美综合精品久久成人| 蜜桃伊人久久| 午夜精品久久久久久| 欧美成人日本| 久久国产精品久久久久久| 欧美精品三级| 久热精品在线视频| 国产精品久久久久久妇女6080| 欧美1区2区| 国产精品一区二区久久精品| 亚洲国产精品悠悠久久琪琪| 国产欧美视频一区二区三区| 亚洲啪啪91| 激情久久中文字幕| 中日韩在线视频| 亚洲精品一区二区三区av| 欧美专区在线| 亚洲欧美一区二区视频| 欧美精品电影| 久久人人97超碰国产公开结果 | 一区二区高清视频| 亚洲国产视频一区二区| 午夜精品久久久久久| 一区二区三区日韩欧美精品| 久久综合免费视频影院| 久久久久国色av免费观看性色| 欧美午夜免费影院| 亚洲日本免费| 亚洲国产黄色片| 久久国产欧美| 欧美综合国产精品久久丁香| 欧美午夜电影一区| 亚洲欧洲一区| 91久久精品日日躁夜夜躁欧美 | 国产精品99久久久久久人| 亚洲精品视频免费在线观看| 久久野战av| 久久人人爽人人爽爽久久| 国产欧美日韩综合一区在线观看 | 久久久久久夜精品精品免费| 欧美一区激情视频在线观看| 国产精品久久97| 亚洲免费大片| 99在线精品视频| 欧美岛国激情| 欧美激情一区二区三区全黄| 在线观看欧美日韩| 久久精品亚洲| 久久久久国产免费免费| 国产女主播一区| 亚洲综合电影| 欧美一区二区三区四区高清| 国产精品久久久久久亚洲毛片 | 99国产欧美久久久精品| 欧美国产日韩视频| 亚洲黄色在线看| 亚洲精选91| 欧美人成免费网站| 亚洲免费久久| 亚洲视频免费观看| 欧美午夜片在线观看| 一本色道久久综合亚洲精品不卡 | 欧美大尺度在线观看| 亚洲第一网站免费视频| 亚洲精品久久久久| 欧美精品一二三| 日韩视频亚洲视频| 亚洲尤物在线视频观看| 国产精品萝li| 午夜免费在线观看精品视频| 久久国产福利| 一区二区三区在线免费观看 | 亚洲小视频在线| 欧美一区在线直播| 狠狠色狠狠色综合系列| 久久青草久久| 亚洲韩国日本中文字幕| 中文av一区特黄| 国产精品欧美在线| 欧美在线视频免费| 老**午夜毛片一区二区三区| 亚洲国产精品123| 欧美激情a∨在线视频播放| 亚洲免费播放| 午夜精品成人在线| 国内成人精品视频| 免费欧美网站| 夜夜嗨av一区二区三区四区| 午夜综合激情| 一区二区视频欧美| 欧美久久久久免费| 亚洲欧美精品| 欧美成人性网| 亚洲香蕉视频| 国内一区二区在线视频观看| 欧美+亚洲+精品+三区| 日韩一级视频免费观看在线| 欧美一区二区网站| 亚洲国产精品视频一区| 欧美日韩亚洲一区三区| 欧美一区二区三区四区在线观看地址| 欧美成人激情视频| 亚洲一区精彩视频| 在线播放国产一区中文字幕剧情欧美| 欧美激情亚洲自拍| 午夜视频在线观看一区二区| 亚洲国产成人不卡| 欧美一区二区精品| 亚洲精品久久久一区二区三区| 国产精品女主播|