有请各位老大了(200分)

  • 主题发起人 主题发起人 sonie
  • 开始时间 开始时间
S

sonie

Unregistered / Unconfirmed
GUEST, unregistred user!
其实这也许不是一个delphi的问题,但与系统相关
本人在C++Builder中定义一个这样的类。
class CTransferData{
public:
WORD Transfer;
BYTE DataType; //数据类型
BYTE Command; //命令
DWORD DataLen; //数据长度;
BYTE* DataBuffer; //数据
};
但是由于需要(网络传输)要转化发BYTE*
我用memcpy来实现 ,比如
CTransferData *tr;
BYTE *bData;
在发送端
bData=new BYTE[sizeof(WORD)+2*sizeof(BYTE)+sizeof(DWORD)+DataLen*sizeof(BYTE)];
memcpy(bData,tr,sizeof(WORD)+2*sizeof(BYTE)+sizeof(DWORD));
memcpy(bData,tr->DataBuffer,tr->DataLen);
SendData(bData,sizeof(WORD)+2*sizeof(BYTE)+sizeof(DWORD)+DataLen*sizeof(BYTE));
而在接收端,假设收到了,放在bData中了
我用
memcpy(tr,bData,sizeof(WORD)+2*sizeof(BYTE)+sizeof(DWORD));
tr->DataBuffer=new[tr->DataLen];
memcpy(tr->DataBuffer,bData,tr->DataLen);
但是这样的实现有问题
在BYTE和WORD对齐方式下是正确的
在DWORD和QUARD WORD对齐方式下就不行了,而要命的是我的程序还要跑在VC下
有人能帮我提个实现或者能否告诉我VC下怎么把对齐方式设为BYTE或WORD,它缺省好象是QUARD WORD


 
VC下把对齐方式设为BYTE:

#pragma pack(push)
#pragma pack(1) //对齐方式设为BYTE,若要word,改成2即可
struct _SHFILEOPSTRUCTA_1
{
HWND hwnd;
UINT wFunc;
LPCSTR pFrom;
LPCSTR pTo;
FILEOP_FLAGS fFlags;
BOOL fAnyOperationsAborted;
LPVOID hNameMappings;
LPCSTR lpszProgressTitle; // only used if FOF_SIMPLEPROGRESS
};
#pragma pack(pop)
 
谢谢,我先试一下
 
好象还是不行
 
建议报文格式定义成结构体,而非类。
 
这应该是一个意思
 
memcpy(bData,tr,sizeof(WORD)+2*sizeof(BYTE)+sizeof(DWORD));
memcpy(bData+sizeof(WORD)+2*sizeof(BYTE)+sizeof(DWORD),tr->DataBuffer,tr->DataLen);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~注意这里
 
那里没错,错的是tr->DataLen
 
to zw84611:
我改成了struct实现,也是一样的。
在C++Builer下我只要改成字节对齐,就不错了
 
#include "WinSock2.h"

...

#pragma pack(push)
#pragma pack(1)
struct DataPacket_S
{

WORD Transfer;
BYTE DataType; //数据类型
BYTE Command; //命令
DWORD DataLen; //数据长度;
BYTE DataBuffer[512]; //数据

};
#pragma pack(pop)

void CTestDlg::OnButton15()
{
// TODO: Add your control notification handler code here
struct DataPacket_S *pDPS;
BYTE *buf;

buf = (BYTE *)malloc(sizeof(DataPacket_S));
pDPS = (struct DataPacket_S *)buf;
pDPS->Transfer = htons(0x1234);
pDPS->DataType = 0x56;
pDPS->Command = 0x78;
pDPS->DataLen = htonl(512);
memset(pDPS->DataBuffer,0x9,512);
send(...,buf,...);
free(buf);
}

单步调试,在内存窗口即可看出数据是否正确。
buf的地址是00432970:
00432970 12 34 56 78 00 00 02 00 09 09 09 09 09 09 09 09 09 09
00432982 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09
...
 
非常感谢
搞定。
昨天是因为我在发送端没有设置对齐
pDPS->Transfer = htons(0x1234);
        ~~~~~~~~~~~~~~~~因为我两边都用memcpy,所以不必转换顺序。
你的代码写得很规范
    

 

Similar threads

回复
0
查看
888
不得闲
I
回复
0
查看
693
import
I
I
回复
0
查看
1K
import
I
I
回复
0
查看
950
import
I
后退
顶部