XML文件如何存储二进制的文件?来着有分啊

keansun 2004-08-06 08:26:31
如上,我是想把一个自定义格式的图片随XML文件一起保存,平时我做的都是保存一些节点数据,这问题我不知道如何解决,对XML还是不太熟悉,请高人指点,解决了就给分。
...全文
255 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
seilfer2000 2004-08-09
学习
回复
liuxianzhi 2004-08-09
mark! Very good!
回复
snaill 2004-08-09
base64网上有很多编码解码的例子,一查就能找到,邮件就是使用它来传输的
回复
keansun 2004-08-09
请hellolwl再次指点,如何还原为原有的文件?
回复
howtotell 2004-08-09

int DecodeBase64(const char* pSrc, unsigned char* pDst, int nSrcLen)
{ int nDstLen;
// 输出的字符计数
int nValue;
// 解码用到的长整数
int i;
i = 0;
nDstLen = 0;
// 取4个字符,解码到一个长整数,再经过移位得到3个字节
while (i < nSrcLen)
{
if (*pSrc != ' ' && *pSrc!=' ')
{
nValue = DeBase64Tab[*pSrc++] << 18;
nValue += DeBase64Tab[*pSrc++] << 12;
*pDst++ = (nValue & 0x00ff0000) >> 16;
nDstLen++;
if (*pSrc != '=')
{
nValue += DeBase64Tab[*pSrc++] << 6;
*pDst++ = (nValue & 0x0000ff00) >> 8;
nDstLen++; if (*pSrc != '=')
{
nValue += DeBase64Tab[*pSrc++];
*pDst++ =nValue & 0x000000ff;
nDstLen++;
} }
i += 4;
}
else // 回车换行,跳过
{
pSrc++;
i++;
}
}
// 输出加个结束符
*pDst = ' ';
return nDstLen;
}
回复
chen_2001 2004-08-08
关注
回复
hellolwl 2004-08-08
//-----------------------------------------------------------------------------
// 功能: 用ADO读取二进制文件,以便保存到xml文件中
// 输入: filename - 欲读取的文件名
// 输出: vReadTo - 保存结果
// 日期: 2004.07.20
//-----------------------------------------------------------------------------
void CFolderListView::AdoReadFile(LPCTSTR filename, _variant_t &vReadTo)
{
try
{
_variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
_StreamPtr adostream;
HRESULT hr = adostream.CreateInstance(_T("ADODB.Stream"));
if (!SUCCEEDED(hr))
{
MessageBox("创建CStream对象失败!");
return;
}
adostream->Type = adTypeBinary;
adostream->Open(varOptional,adModeUnknown, adOpenStreamUnspecified, _T(""), _T(""));

adostream->LoadFromFile(_bstr_t(filename));
vReadTo = adostream->Read(adReadAll);
adostream->Close();
}
catch (_com_error &e)
{
AfxMessageBox(e.ErrorMessage());
}
}

_variant_t vAttrValue;
AdoReadFile(strWMFPath, vAttrValue);
pNode->put_dataType(_bstr_t("bin.base64")); //pNode是IXMLDOMNode*类型
pNode->put_nodeTypedValue(vAttrValue);

注意在stdafx.h中加:
#import "c:\Program Files\common files\system\ADO\msado15.dll" rename_namespace("ado25") rename("EOF","adoEOF")

using namespace ado25;
回复
bestbear 2004-08-08
Mark先
回复
howtotell 2004-08-07
/*
函数:Base64编码
*/
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;
}
回复
lkcowboy 2004-08-07
自定义格式的图片真麻烦,还不如常见格式加密
回复
microyzy 2004-08-06
如果量大的话,用非解析实体吧,xml标准本身是支持的,但是我确实没有用过,呵呵
如果量不大,那就用base64编码吧,这个简单一些,效率会低一些
回复
huaboy408 2004-08-06
进制数据在XML文件中的存储方法一般有三种:
非解析实体和Base64编码(一种 MIME 编码方式,将二进制数据映射到US-ASCII码的一个子集[0-9a-zA-Z+/] - 见RFC 2045 );十六进制编码(每二进制字节用两个十六进制字符[0-9a-fA-F]表示)以及非解析实体(二进制数据存储在与该XML分离的物理实体内)。
二进制数据的最大问题在于数据转换产品对它的支持不够,所以要检查你的软件是否支持。另一个问题是,大部分(全部?)数据转换产品都不存储符号和实体声明。这样,将 XML 中的数据转换到数据库中时,与某些实体对应的符号就会丢失。(关于符号的更多信息详见 XML 标准的 4.7 部分)。
回复
huaboy408 2004-08-06
二进制数据在Xml里通常是以Base64 编码;效率实在是不
回复
keansun 2004-08-06
这个好像是用来加密的,和我这个没有什么关系啊
回复
keansun 2004-08-06
能说的详细些么
回复
醉马不肖 2004-08-06
base64编码之后,再存
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-08-06 08:26
社区公告

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