CopyMemory的问题。不是高手就不用进来了。

pp616 2001-12-08 12:06:36
我的程序是这样的。
服务器端发送一个字符串长度为318个字节
然后在客户端接收下来。之后将其存放在一个我定义的数据类型中。
我的服务端段没问题。问题在客户端。
我的代码是这样的。
myudp.h中定义了一个我的数据类型:
struct SZ_DATA
{
char Falg[2];
char SeekLen[7];
char Name[6];
char CName[8];
char YesterdayP[9];
char TodayStartP[9];
char NowP[9];
char Valuem[12];
char ValuemP[17];
char BargainNO[9];
char HeightBargainP[9];
char LowBargainP[9];
char SYL1[7];
char SYL2[7];
char PUpDown1[9];
char PUpDwon2[9];
char HYCCL_Bak[12];
char PP4[9];
char PValuem4[12];
char PP3[9];
char PValuem3[12];
char PP2[9];
char PValuem2[12];
char PP1[9];
char PValuem1[12];
char BP1[9];
char BValuem1[12];
char BP2[9];
char BValuem2[12];
char BP3[9];
char BValuem3[12];
char BP4[9];
char BValuem4[12];
}SZDATA;
然后在myudp.cpp中我这样做的:
void __fastcall TForm1::udpacceptDataReceived(TComponent *Sender,
int NumberBytes, AnsiString FromIP, int Port)
{
static char *buf;
buf=new char[NumberBytes];
FillMemory(buf,NumberBytes,0);
FillMemory(&SZDATA,sizeof(SZDATA),0);
//将接收到的数据存入buf
udpaccept->ReadBuffer(buf,NumberBytes,NumberBytes);
//直接拷贝内存块到我的数据类型中
CopyMemory(&SZDATA,buf,sizeof(SZDATA));
ShowMessage(SZDATA.Falg);
delete buf;
}
///////////////////////////////////////////////////////////////
但是在ShowMessage(SZDATA.Falg)的结果并非接收到的数据的头两个字节,而是整个接收到的数据,而ShowMessage(SZDATA.SeekLen)的结果是接收到的数据的第3个字节到最后一个字节。为什么会这样呢。我明明已经定义好了char Falg[2]这只有两个字节啊怎么会把所有的数据都放在了里面呢???

还望高手能指点一二。小弟感激不尽!!!!!

...全文
315 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
logical 2001-12-08
  • 打赏
  • 举报
回复
我不是高手,但我进来了.
我不是高手,但我十分明白这是怎么回事.
我不是高手,但我建议你先看看书,搞清楚字符串与字符数与指针的关系.

你可以看看 SZDATA.Falg+3 的值.
如果有
char *pData=&SZDATA;
请看看 pData[0] 与 pData+0
请看看 pData[1] 与 pData+1
请看看 pData[2] 与 pData+2
...........

windindance(风之舞)说的十分正确,他是不是高手我不知道,我知道的是:真正喜欢玩C的人都会明白而无需是高手.
windindance 2001-12-08
  • 打赏
  • 举报
回复
char Falg[2]只有两个字节,但
对于字符串指针而言,只有"\0"才是字符串的结束符.
所以ShowMessage就显示了所有你接收到的数据.
pp616 2001-12-08
  • 打赏
  • 举报
回复
谢谢大家的指教。也谢谢大家的批评。我就不多解释什么了。^_^
好了。问题解决的方法你们已经告诉我了。我要下去写代码了。
至于分吗。大家说的对我都有帮助。大家平摊。
还有个问题还请大家帮帮忙。
http://www.csdn.net/expert/topic/409/409436.shtm
kingfish 2001-12-08
  • 打赏
  • 举报
回复
程序是对的,不要'\0'可以节省空间,提高传输效率
主要是ShowMessage的问题
你的结构中如果全填慢,就可能没有'\0'
ShowMessage(p); //将p 到 p+n (如果*(p+n)='\0')的内容显示出来

我也很菜,但好奇,想看看只有高手才能搞定的问题到底什么样,
just so so
ciml 2001-12-08
  • 打赏
  • 举报
回复
你发送端是如何发送的?
ciml 2001-12-08
  • 打赏
  • 举报
回复
他用的内存拷贝,应该可以不加'\0'的.

udpaccept->ReadBuffer(buf,NumberBytes,NumberBytes);是如何实现的?
8追8梦8 2001-12-08
  • 打赏
  • 举报
回复
这还要高手来解决呀,受不了你!!!
加结束标记了么,char[2]的第二个字符必须是"\0",要不他就会找到第一次出现"\0"的位置的,
同理,其他的也要~~~,我就不多说了,自己整吧,顺便告诉你一声,我很菜的:)

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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