请教一个字符串被截断的问题(高分)

来源:百度知道 编辑:UC知道 时间:2024/06/01 22:46:33
问题代码如下:
CComVariant Value;
Value.vt = VT_BSTR;
unsigned long ReadBuffGroup[256] = {0};
CString Temp, ReadBuff="";
for(int i = 0; i < 256; i++)
{
ReadBuffGroup[i] = (RecvDatabuf[4*i+8] < <24) + (RecvDatabuf[4*i+9] < <16) + (RecvDatabuf[4*i+10] < <8) + RecvDatabuf[4*i+11];
Temp.Format(_T("%08x"), unsigned(ReadBuffGroup[i]));
ReadBuff = ReadBuff + " " + Temp;
}
Value.bstrVal = ReadBuff.AllocSysString();

说明:unsigned char类型数组ReceDatabuf[1032]中存放了1032个字节的16进制数据, 现在要获取其中后面1024个字节的数据(即去掉前8个字节的头), 并将其赋给CComVariant

出错状况:循环结束后, CString类型变量ReadBuff中的数据已被第一次截断, 只有1024个字节的其中一部分, 将其通过ReadBuff.AllocSysString()赋值给BSTR类型时被第二次截断, 是何原因? 不解, 求教, 谢谢! 是在开发ATL程序时碰到的问题.

高分悬赏, 望能尽快解决问题!
感谢所有回答的朋友, 今天我又跟了一下程序, 可以确定的是循环结束后unsigned long ReadBuffGroup数组是能够保存全我需要的数据的, 我尝试使用::MessageBox()函数弹窗检测ReadBuff以及Value.bstrVal中的数据时发现1024个字节的数据是能够全部储存到的, 所以关键的问题就在于CString类

楼上说的不对,不信你试试
unsigned char c = 1;
int a = c << 16;
结果a == 10000

而且就算结果变为0,楼主已经转化为字符串,不可能被“截断”
Temp.Format(_T("%08x"), unsigned(ReadBuffGroup[i]));

不过不理解lz说的截断,究竟是字符串被截断,还是数据不对(有些数据是00000000)

如果是字符串被截断,有可能在其它地方内存有越界的情况,有些时候这种情况会导致很莫名其妙的事情发生。

////////////////////////////////////
回复Sumerhotzzy,不好意思我写的10000应该是0x10000十六进制的-_-"

回复楼主,闹了半天原来是用MessageBox显示啊,MessageBox对于过长的字符串是会自动截断的,否则对于特长的串甚至会占满整个屏幕,那样甚至连确认按钮都不显示不了,微软当然不能让这种事情发生,所以系统会自动截断字符串的。

而CString是没有长度限制的,只受限于操作系统!

楼主非要弹出对话框显示所有数据,我觉得只能自己做一个对话框了,然后可以用CEdit控件或其它能显示字符串的控件来显示。

DWORD k;
CComVariant Value;
Value.vt = VT_BSTR;
unsigned char RecvDatabuf [1032];
::ReadProcessMemory((void*)-1,(const void *)0x00400000,RecvDatabuf,1032,&k);
unsigned long ReadBuffGroup[256] = {0};
CString Temp, ReadBuff="";

for(int i = 0; i < 256; i++)
{