关于数据剥离!!高手请进!!!(200分)

  • 主题发起人 主题发起人 fballmikor
  • 开始时间 开始时间
F

fballmikor

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在正在一个用SOCKET通信的SERVER端程序,接收一个用VC编写的CLIENT端
传过来的数据。但VC客户端发来的数据包不是裸数据,它包含了一些控制信息,如长
度信息,除去控制信息得到才能得到我想要的部分。
不知怎样进行数据剥离。请高手指点一二,有这方面的源码请发给我一份,我
会另外加分的。
 
高手快来指点一下小弟!!!
 
知道数据格式的话应该很容易的啊!就是字符串的剪接罢了!如果你不知道定义的格式的话....
 
to only you :
你好!
他用VC发过来的完整包的格式是这样的:
struct{
unsigned int PacketType; 包号
unsigned char recnum; 包体记录数(1..50)
unsigned char totalrec; 包体总记录数
unsigned char endflag; 结束包标志(0--结束包 1--非结束包)
unsigned int Request; 请求类型
unsigned int Answer; 应答类型
unsigned char Apu; 语音工作站号码
unsigned char Channel; 语音通道号码
}PUB_SOCKET_HEAD; 包头
Struct {
unsigned char Fields[8][16];
}PUB_SOCKET;

我在DELPHI中对应的数据格式为:
PUB_SOCKET_HEAD=RECORD
packetType:dword;
recnum:byte;
totalrec:byte ;
endflag:byte;
request:dword;
answer:dword;
Apu:byte;
Channel:byte;
// D:array[0..11] of char;
//DD:INTEGER;
END;
type FIELD=array[0..7,0..15] of byte;
PUB_SOCKET=RECORD
Fields:FIELD;
end;
请问如何数据剥离。万分感激!!!
 
你要作到什么样的效果?可以明白一点吗?
Mailto me
 
对呀。你到底需要那些数据呀。
 
两边的结构都知道得清清楚楚了,你还想怎么样?
 
如果你的数据在头部之后的话,我提供一个思路:

如下定义数据包的完整格式:
const
max_data_len = 1024 ; 当然只有你知道该多大,不过不怕太大,因为我们用指针处理
type
my_socket_data = record
head : PUB_SOCKET_HEAD ; 或者还有许多其它格式化的头
data : array [0..max_data_len] of char; 当然可以定义为char类型
end;
程序中这样做,先定义变量
var
my_data: ^my_socket_data;
假释你接受的数据在buffer中,则
my_data=@buffer;
现在,my_data.data就是你要的纯数据了
 
PUB_SOCKET_HEAD = Packed RECORD
 
如果象教父而言,我觉得所谓的数据剥离的意义好象不大,只要注意VC的数据结构
的对齐方式和Delphi的对齐方式是否一致就行了(即,是否在record等前使用packed等)。
如果不知道对齐方式的话,呵呵,稍微要有点......
 
to jackliew:
什么是对齐方式?加packed等是什么意思,有什么作用?
谢谢各位!!!
 
在windows中,为了提高数据的访问速度,通常补充字节,使一个结构,如:C中的struct
和delphi中的record 达到一个cpu的寻址单位,如4个字节(32位)在VC中有16,8,4,2,1
几种对齐方式,如下:
struct CstrctTmp{
int i ;
char c ;
}选用16字节对齐就是会添加11个字节,因此,使用其他的对齐方式访问数据就会获取
不到正确的i,c
而delphi中加packed record 使结构强制使用1bytes对齐。
 
多人接受答案了。
 
后退
顶部