请教:BASE64解码

Ah 2003-06-25 04:06:52
我有一段BASE64加解码的代码,
在将文本文件编码和解码时是正确的,但是直接从一个二进制文件中解码时却使二进制文件不能再使用了,也就是编解码出错了.
请问怎样解决?

现有可用的代码给我对照一下更好。
谢谢
...全文
154 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
howtotell 2003-06-26
  • 打赏
  • 举报
回复
CString CTransfer::Base64(LPCTSTR szEncoding, int nSize)
{
//Base64编码字符集:
CString m_sBase64Alphabet = _T("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
char *szOutput;
//计算空间
int size = (nSize + 2) / 57 * 2;
size += nSize % 3 != 0 ? (nSize - nSize % 3 + 3) / 3 * 4 : nSize / 3 * 4;
szOutput = new char[size + 1];
memset(szOutput, 0, size + 1);

LPCTSTR szInput = szEncoding;

int nBitsRemaining = 0, nPerRowCount = 0;//换行计数
register int nBitStorage = 0, nScratch = 0;
int i, lp, endlCount;

for(i=0, lp=0, endlCount = 0; lp < nSize; lp++)
{
nBitStorage = (nBitStorage << 8) | (szInput[lp] & 0xff);//1 byte//the lowest-byte to 0 not cycle
nBitsRemaining += 8;//读了一个字节,加八位

do//nBitStorage"剩下的位"记录变量
{
nScratch = nBitStorage >> (nBitsRemaining - 6) & 0x3f;//提出最前的六位
szOutput[i++] = m_sBase64Alphabet[nScratch];
nPerRowCount++;
if(nPerRowCount >= 76)
{
szOutput[i++] = '\r';
szOutput[i++] = '\n';
endlCount += 2;
nPerRowCount = 0;
}
nBitsRemaining -= 6;
}while(nBitsRemaining >= 6);
}

if(nBitsRemaining != 0)
{
//原数据最后多一个两个字节时进入,编码未结束nBitsRemaining!=0
nScratch = nBitStorage << (6-nBitsRemaining);//空位补0
nScratch &= 0x3f;
szOutput[i++] = m_sBase64Alphabet[nScratch];
nPerRowCount++;
if(nPerRowCount >= 76)
{
szOutput[i++] = '\r';
szOutput[i++] = '\n';
endlCount += 2;
nPerRowCount = 0;
}
}

// Pad with '=' as per RFC 1521
while((i - endlCount) % 4 != 0)
{
szOutput[i++] = '=';
nPerRowCount++;
if(nPerRowCount >= 76)
{
szOutput[i++] = '\r';
szOutput[i++] = '\n';
endlCount += 2;
nPerRowCount = 0;
}
}

CString strResult = szOutput;
delete[] szOutput;
return strResult;
}
Ah 2003-06-26
  • 打赏
  • 举报
回复
还有一点,对文本文件操作时,只对英文件字母可以正确的编解码.汉字什么的都成了乱码
Ah 2003-06-26
  • 打赏
  • 举报
回复
//以下是读取文件的代码
CFile ff;
ff.Open(OLE2A(filename),CFile::modeRead);

UINT srcLen = ff.GetLength();
UINT ll = srcLen / 3 * 4;
if(ll<4) ll = 4;
if(srcLen % 3>0) ll+=4;
char * pSrc = new char[srcLen];

ff.ReadHuge(pszSrc,srcLen);
ff.Close();
Ah 2003-06-26
  • 打赏
  • 举报
回复
谢谢各位,问题已被我自已解决了

加上又升了一级,开心!不多说了,散分先!
theone 2003-06-25
  • 打赏
  • 举报
回复
能对文本文件正确编码解码,应该说你的编码解码部分没有错,可能问题出在二进制文件的操作上,把你对文件操作的代码贴出来看看先
coyer 2003-06-25
  • 打赏
  • 举报
回复
BASE64解码,

不懂,学习!
冷羽 2003-06-25
  • 打赏
  • 举报
回复
还有在解码的时候要如数的字节数应给是4的倍数.
冷羽 2003-06-25
  • 打赏
  • 举报
回复
文件的打开模式不对.
你可以试一试其他的他开模式.比如二进制.
xiaohedou 2003-06-25
  • 打赏
  • 举报
回复
:BASE64解码,

不懂,学习!支持一下!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧