把一个长文本(unicode string)存入一个二进制字段里面,再读出来的时候,发现尾部多出很多乱码,像这样:
写入时的字符串:“晴朗,间或有少云,能见度较好。分辨率为1个波束,平均十六次。”(30个字符,60字节)
读出时的字符串:“晴朗,间或有少云,能见度较好。分辨率为1个波束,平均十六次。췍﷽﷽ꮫꮫꮫꮫﻮﻮﻮ”
读出显示的时候,GetActualSize也是60个字节,为CString预申请60/2=30个字符的空间,然后把pBuf中的字符串拷贝到CString里面,却出现了乱码,什么原因呢?怎么改?
写入lFileLength = item.strDetail.GetLength();               // strDetail是要写入的字符串,CString类型(vs05中的CString默认是Unicode的吧?)
pBuffer = new BYTE[lFileLength*2]; // lFileLength is the UNICODE string length
pBuf = pBuffer;
memcpy(pBuffer,item.strDetail.GetBuffer(),lFileLength*2);
// 将这块内存放到variant里面

rgsabound[0].lLbound = 0;
rgsabound[0].cElements = lFileLength*2;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
for (long i = 0; i < (long)lFileLength*2; i++)
SafeArrayPutElement (psa, &i, pBuf++);
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa; m_pRecordset->GetFields()->GetItem("specDetail")->AppendChunk(varBLOB);
delete [] pBuffer;读出lDataSize = m_pRecordset->GetFields()->GetItem("specDetail")->ActualSize;///得到数据的长度
if(lDataSize > 0)
{
_variant_t varBLOB;
varBLOB = m_pRecordset->GetFields()->GetItem("specDetail")->GetChunk(lDataSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))                                 ///判断数据类型是否正确
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);              ///得到指向数据的指针
/*****在这里我们可以对pBuf中的数据进行处理*****/
strDetail.Preallocate(lDataSize/2);
memcpy(strDetail.GetBuffer(),pBuf,lDataSize);
SafeArrayUnaccessData (varBLOB.parray);
}
}