function TCommunication.SendDataBuffers(GateIdx: Integer; Gate: pTGateInfo; MsgList: TList): Boolean;
DataA: PChar;
DataB: PChar;
DataC: PChar;
I: Integer;
nDataALen: Integer;
nDataBLen: Integer;
nDataCLen: Integer; try I := 0;
DataA := MsgList.Items[I];
while (True) do begin
try
if (I + 1) >= MsgList.Count then Break;
DataB := MsgList.Items[I + 1];
Move(DataA^, nDataALen, SizeOf(Integer));
Move(DataB^, nDataBLen, SizeOf(Integer)); if (nDataALen + nDataBLen) < g_Config.nBlock then begin
MsgList.Delete(I + 1);
GetMem(DataC, nDataALen + SizeOf(Integer) + nDataBLen);
nDataCLen := nDataALen + nDataBLen;
Move(nDataCLen, DataC^, SizeOf(Integer));
Move(DataA[SizeOf(Integer)], PChar(DataC + SizeOf(Integer))^, nDataALen);
Move(DataB[SizeOf(Integer)], PChar(DataC + nDataALen + SizeOf(Integer))^, nDataBLen);
FreeMem(DataA);
FreeMem(DataB);
DataA := DataC;
MsgList.Items[I] := DataA;
end;
说明下这个MsgList它加载的是一个文本文件中的内容(汉字),g_Config.nBlock是Integer类型的它的值是1024
1.Move(DataA^, nDataALen, SizeOf(Integer));从这里我就开始犯迷糊了.
我个人理解是DataA^从这里移动SizeOf(Integer)这么多字节到nDataALen,但是DataA是PChar类型nDataALen是Integer的, 移 过去之后变成什么东西了?搞不懂
2.if (nDataALen + nDataBLen) < g_Config.nBlock then begin这里他们进行比较,nDataALen和nDataBLen肯定是数值了, 怎么知道他们是多大的数
3.Move(nDataCLen, DataC^, SizeOf(Integer));这句也不太明白
4.Move(DataA[SizeOf(Integer)], PChar(DataC + SizeOf(Integer))^, nDataALen);
DataA[SizeOf(Integer)]从这个位置开始移动,这个位置内容是什么?这段代码求解释,翻译
DataA: PChar;
DataB: PChar;
DataC: PChar;
I: Integer;
nDataALen: Integer;
nDataBLen: Integer;
nDataCLen: Integer; try I := 0;
DataA := MsgList.Items[I];
while (True) do begin
try
if (I + 1) >= MsgList.Count then Break;
DataB := MsgList.Items[I + 1];
Move(DataA^, nDataALen, SizeOf(Integer));
Move(DataB^, nDataBLen, SizeOf(Integer)); if (nDataALen + nDataBLen) < g_Config.nBlock then begin
MsgList.Delete(I + 1);
GetMem(DataC, nDataALen + SizeOf(Integer) + nDataBLen);
nDataCLen := nDataALen + nDataBLen;
Move(nDataCLen, DataC^, SizeOf(Integer));
Move(DataA[SizeOf(Integer)], PChar(DataC + SizeOf(Integer))^, nDataALen);
Move(DataB[SizeOf(Integer)], PChar(DataC + nDataALen + SizeOf(Integer))^, nDataBLen);
FreeMem(DataA);
FreeMem(DataB);
DataA := DataC;
MsgList.Items[I] := DataA;
end;
说明下这个MsgList它加载的是一个文本文件中的内容(汉字),g_Config.nBlock是Integer类型的它的值是1024
1.Move(DataA^, nDataALen, SizeOf(Integer));从这里我就开始犯迷糊了.
我个人理解是DataA^从这里移动SizeOf(Integer)这么多字节到nDataALen,但是DataA是PChar类型nDataALen是Integer的, 移 过去之后变成什么东西了?搞不懂
2.if (nDataALen + nDataBLen) < g_Config.nBlock then begin这里他们进行比较,nDataALen和nDataBLen肯定是数值了, 怎么知道他们是多大的数
3.Move(nDataCLen, DataC^, SizeOf(Integer));这句也不太明白
4.Move(DataA[SizeOf(Integer)], PChar(DataC + SizeOf(Integer))^, nDataALen);
DataA[SizeOf(Integer)]从这个位置开始移动,这个位置内容是什么?这段代码求解释,翻译
不过我可以解释这句:Move(DataA[SizeOf(Integer)], PChar(DataC + SizeOf(Integer))^, nDataALen);其中DataA[SizeOf(Integer)]等价于PChar(Integer(DataA)+Sizeof(Integer))^,即指向地址为Integer(DataA)+Sizeof(Integer)的一个字符
还有函数的var参数,也会让调用者忘了其实是编译器进行了地址转换
try I := 0;//这变量有点像摆设,它一直没改变。我都不明白为什么要设置这个变量
DataA := MsgList.Items[I];//取出 MsgList 的第 0 行数据给 DataA
while (True) do begin //设置一个死循环
try
if (I + 1) >= MsgList.Count then Break; //如果 MsgList 的行数少于等于 1 则不再循环
DataB := MsgList.Items[I + 1];//取出 MsgList 的第 1 行数据给 DataB
Move(DataA^, nDataALen, SizeOf(Integer));//从 DataA 头 4 个字节取值给 nDataALen (大概是标志着 DataA 的长度)
Move(DataB^, nDataBLen, SizeOf(Integer));//参考上一行 if (nDataALen + nDataBLen) < g_Config.nBlock then begin//如果DataA与DataB的和少于1024
MsgList.Delete(I + 1);//删除 MsgList 的第 1 行
GetMem(DataC, nDataALen + SizeOf(Integer) + nDataBLen);//按DataA与DataB的长度+4为长度,分配内存空间给 DataC
nDataCLen := nDataALen + nDataBLen;//设置 DataC 的长度为 DataA + DataB 的长度
Move(nDataCLen, DataC^, SizeOf(Integer));//将 DataC 的长度写入它的头 4 个字节
//下面的两句,估计第二个参数处有误——用一个 pchar 去加一个整型
Move(DataA[SizeOf(Integer)], PChar(DataC + SizeOf(Integer))^, nDataALen);
Move(DataB[SizeOf(Integer)], PChar(DataC + nDataALen + SizeOf(Integer))^, nDataBLen);
FreeMem(DataA);//释放,下同
FreeMem(DataB);
DataA := DataC;//将 DataC 赋值给 DataA
MsgList.Items[I] := DataA;//将 DataA 写入 MsgList 的第 0 行
end;
......
Move(nDataCLen, DataC^, SizeOf(Integer));//将 DataC 的长度写入它的头 4 个字节
Move(DataA[SizeOf(Integer)], PChar(DataC + SizeOf(Integer))^, nDataALen);//在 DataC 的开头 4 个字节后写入 DataA[4] 后的数据
Move(DataB[SizeOf(Integer)], PChar(DataC + nDataALen + SizeOf(Integer))^, nDataBLen);//在 DataC 的开头偏移(4 个字节 + DataA[4] 后的数据长度)的位置写入 DataB[4] 起的数据
FreeMem(DataA);//释放,下同
......
也就是说,DataC 内容是:头 4 个字节是 DataC 数据的长度(不是DataC的长度!),紧接着是 DataA 的数据,最后是 DataB 的数据。 PChar(DataC + SizeOf(Integer))^ ————指 DataC 相对其第一个位置偏移了 SizeOf(Integer) 那么多的一个位置,Move 方法就是将数据在这个位置开始写入的(写入的内容是 DataA[4] 后的数据,长度是 nDataALen 个)。
struct tagDataNode{
int Length;
unsigned char Data[];
}DataNode,*LPDataNode;
LPDataNode = ^DataNode;
DataNode = packed Record
Length: Integer;
Data: array[0..0] of Byte; //这里的下标只是一个形式定义,可以通过动态内存分配指向任意有效长度内存
end;
说的太专业了没明白呀,移动4个字节到目的地,nDataALen他是多大的值呢?DataA[SizeOf(Integer)这个位置是什么呢
这句相当于
nDataALen := PIneger(DataA)^;
后者明显高效最好是象unsigned所说,定义一个结构来处理,更好维护.