从结构体里取出的数据为何有乱码? 急,在线等

shuihan20e 2013-01-27 12:44:32
结构体定义如下

//CMS流水
typedef struct _CMSWaste
{
TDevInfo DevInfo;
char Content[1024];
int Light;
char Remark1[20];
char Remark2[20];
}TCMSWaste;

从SOCKET里读出来正常

TCMSWaste cmswaste;
memset(&cmswaste, 0, sizeof(TCMSWaste));
int retcms = m_peer[i]->ReadData((char*)&cmswaste, sizeof(TCMSWaste));
if (retcms < 0)
{
//读取CMS包错误
//ErrorReport("读取CMS包错误");
ReleaseCritical();
continue;
}
else if (retcms == 0)
{
ReleaseCritical();
continue;
}
ErrorReport("收到(IP:%s)发送的CMS数据", ip);

if ((m_DbOper.HandleCMSMsg(cmswaste))&&(m_DbOper.HandleCMSErrorMsg(cmswaste)))
{
ErrorReport("处理CMSMsg成功");
//返回成功信息
m_peer[i]->SendData("OKOK", 4);
}
else
{
ErrorReport("处理CMSMsg失败");
m_peer[i]->SendData("ERRO", 4);
//断开连接
m_peer[i]->FreePeer();
}

handleCMSMsg定义如下

BOOL CPRJ_DbOperate::HandleCMSMsg(TCMSWaste &cms)
{
ErrorReport("HandleCMSMsg");
char DevCode[10];
memset(DevCode, 0, sizeof(cms.DevInfo.DevCode));
memcpy(DevCode, cms.DevInfo.DevCode, sizeof(cms.DevInfo.DevCode));
ErrorReport("DevCode:%s", cms.DevInfo.DevCode);

char Remark1[20];
memset(Remark1, 0, sizeof(cms.Remark1));
memcpy(Remark1, cms.Remark1, sizeof(cms.Remark1));
ErrorReport("Remark1:%s", Remark1);

char Remark2[20];
memset(Remark2, 0, sizeof(cms.Remark2));
memcpy(Remark2, cms.Remark2, sizeof(cms.Remark2));
ErrorReport("Remark2:%s", Remark2);

char Content[1024];
memset(Content, 0, sizeof(cms.Content));
memcpy(Content, cms.Content, sizeof(cms.Content));
ErrorReport("content:%s", Content);

char CheckTime[14];
memset(CheckTime, 0, sizeof(cms.DevInfo.CheckTime));
memcpy(CheckTime, cms.DevInfo.CheckTime, sizeof(cms.DevInfo.CheckTime));
ErrorReport("CheckTime:%s", CheckTime);

CString tmpGUID = GenrGUID();
ErrorReport("GUID:%s", tmpGUID);
CString sql;
//sql.Format(_T("INSERT INTO DevWaste_CMS VALUES ('%s', '%s', to_date('2012-12-12 12:12:12', 'yyyy-mm-dd hh24:mi:ss'), '%s', %d, '%s', '%s', 0)"), (LPCTSTR)tmpGUID, DevCode, CheckTime, Content, cms.Light, Remark1, Remark2);
sql.Format("INSERT INTO DevWaste_CMS VALUES ('%s', '%s', to_date('%s', 'yyyy-mm-dd hh24:mi:ss'), '%s', %d, '%s', '%s', 0)", (LPCTSTR)tmpGUID, DevCode, CheckTime, Content, cms.Light, cms.Remark1, cms.Remark2);
ErrorReport("sql:%s",(LPCTSTR)sql);
if (ExecuteSql(sql))
return TRUE;
else
return FALSE;
}

为何,打印出来的所有的charo数组都是乱码呢?
...全文
225 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2013-01-27
  • 打赏
  • 举报
回复
你在确认以下几点: 1. 发送的字节数是否正确? 2. 收到的字节数是否跟发送的字节数相同? 3. 发送和收到的字节是否相同? 即收到的数据是否正确. m_peer[i]->SendData("OKOK", 4);这个发送长度你没有包括 \0 结尾, 有可能会导致未知的错误.
zhangyihu321 2013-01-27
  • 打赏
  • 举报
回复
单字节对齐??
qq5069099 2013-01-27
  • 打赏
  • 举报
回复
有两个可能, 1,发送的数据少,而你用一个接构体接收,没有达到填充所有结构体的空间,所以结构体内的数据不是接收到的数据,而是或初始化或款初始化的随机数 2,一次没有收完所有数据,而是部份数据,如果是第二次收到数据后与结构体内成员就会有错位,这样看起来是很乱的数据了.
shuihan20e 2013-01-27
  • 打赏
  • 举报
回复

void CTO_LogReport::ErrorReport(const char* fmt, ...)
{
	va_list ap;
	char buf[8096];
	va_start(ap,fmt);
	_vsnprintf(buf, sizeof buf, fmt, ap);
	va_end(ap);
	if (m_debug_mode)
	{
		printf("%s\n", buf);
	}

	Acquire();
	_ErrorReport(buf);
	Release(); 
 
}

void CTO_LogReport::_ErrorReport(const char *msg)
{
  char file_name[MAX_FILE_LEN];
  make_full_file_name(file_name, sizeof file_name, 0);
  HANDLE hFile=CreateFile(
    file_name, 
    GENERIC_WRITE,
    0,
    NULL,
    OPEN_ALWAYS,
    FILE_ATTRIBUTE_NORMAL,
    0);
  if (INVALID_HANDLE_VALUE==hFile) return;
  DWORD file_len;
  try
  {
    file_len=SetFilePointer(hFile, 0, NULL, FILE_END);
    SYSTEMTIME time;
    GetLocalTime(&time);
    char buf[32];
    _snprintf(buf, sizeof buf, "%.2d-%.2d %.2d:%.2d:%.2d.%.3d ", time.wMonth, time.wDay,
      time.wHour, time.wMinute, time.wSecond, time.wMilliseconds);
    DWORD BytesWritten;
    if (!WriteFile(hFile, buf, (DWORD)strlen(buf), &BytesWritten, NULL)) {
      CloseHandle(hFile);
      return;
    }
    if (!WriteFile(hFile, msg, (DWORD)strlen(msg), &BytesWritten, NULL)) {
      CloseHandle(hFile);
      return;
    }
    buf[0]=0x0D;
    buf[1]=0x0A;
    buf[2]=0;
    WriteFile(hFile, buf, 2, &BytesWritten, NULL);
  }
  catch(...)
  {
  }
  CloseHandle(hFile);
  if (m_max_file_len<=file_len)
  {
    roll_files();
  }
}
定义如下
用户 昵称 2013-01-27
  • 打赏
  • 举报
回复
是不是乱码,要看数据的格式以及打印方式。
hdg3707 2013-01-27
  • 打赏
  • 举报
回复
你先单步执行到你要打印的代码,看看要打印的数组里的数据对不对,另外,你打印时最好不要用字符型,因为不是所有的数据都是可显示的,不可显示的字符就是个乱码,你转成二进制或16进制显示,这样不可都显示出来: CString str; str.Format("%02x",数据);//这是按16进制显示 CString str; str.Format("%d",数据);//这是按10进制整数显示
jimette 2013-01-27
  • 打赏
  • 举报
回复
char 最好换成TChar!
孤客天涯 2013-01-27
  • 打赏
  • 举报
回复
客户端和服务端程序全是自己写的吗?对于一个结构体,最好不要用sizeof来算大小,这里存在一个字节对齐的问题,就拿你 typedef struct _DevInfo { BYTE DevType; char DevCode[10]; char CheckTime[14]; char ErrorStatus[20]; int CheckError; }TDevInfo; 来说,这个结构体大小应该是49个字节,但sizeof算出来的是52,也就是里面的BYTE会按4字节对齐处理,如果对方发49字节过来,而你这边用52字节来接收,肯定会有问题,所以你结构体最好是设置成按1字节对齐。 #pragma pack(1) typedef struct _DevInfo { BYTE DevType; char DevCode[10]; char CheckTime[14]; char ErrorStatus[20]; int CheckError; }TDevInfo; #pragma pack()
shuihan20e 2013-01-27
  • 打赏
  • 举报
回复
typedef struct _DevInfo
{
	BYTE DevType;
	char DevCode[10];
	char CheckTime[14];
	char ErrorStatus[20];
	int CheckError;
}TDevInfo;
孤客天涯 2013-01-27
  • 打赏
  • 举报
回复
TDevInfo DevInfo;是什么东东?把TDevInfo定义贴上来看看

16,472

社区成员

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

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

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