一个聊天软件的一段代码帮忙分析下 ( 积分: 30 )

  • 主题发起人 主题发起人 ukn_ma4
  • 开始时间 开始时间
U

ukn_ma4

Unregistered / Unconfirmed
GUEST, unregistred user!
代码来自深入delphi6网络编程,是用户请求服务器转发聊天信息处理子过程的一断代码.原文是这样的:
var
inbuf:array of byte;
basepos:integer;
idnum:integer;
const:contrallen=16;//定义协议包头长度
basepos=contrallen;
idnum:=Pinteger(@inbuf[basepos])^;这句书上说是获得聊天对象标志符但是就我理解是把inbuf[16]地址中的字节数据转化成整数这和书上说的不同呀,请哪位大虾教教 小第谢谢了
顺便说下客户端向服务端发送聊天信息的协议是这样的:
fafafa....(包头) 接收用户标志符(integer) 聊天信息(可变长度) 0结束符
 
下面还有一段代码是这样的:inc(basepos.sizeof(integer));
 
inbuf[basepos]表示数组inbuf的第basepos个元素
@inbuf[basepos]表示数组inbuf的第basepos个元素的内存地址
Pinteger(@inbuf[basepos])表示转换数组inbuf的第basepos个元素的内存地址中保存的值为整数类型,注意整数是4位的,所以
Pinteger(@inbuf[basepos])^就是数组inbuf的第basepos个元素和随后的三个元素一起组合成一个整数值
根据通讯协议,这个值应该为聊天对象标志符

你的理解也基本是对的啊,通讯协议中报头占16字节,后面跟着的就是聊天对象标志符
所以这个串中第17字节开始的四个字节就表示聊天对象标志符

你说得inbuf[16]地址中的字节数据转化成整数直接用Integer(inbuf[basepos])就可以了,不用这么麻烦还涉及到地址操作
 
谢谢你了 大富翁上好多好人 55555555 thank you
 
后退
顶部