Delphi TIdTCPClient读取字节数
Seg参数:Delphi TIdTCPClient读取字节数,delphi,Delphi,Seg参数: liBinID : LongInt; liAux : LongInt; classID : TJPIPDatabinClass; liCodestreamID: LongInt; iOffset : Integer; iLength : Integer; arrData : TBytes; isFinal : Boolean; isEOR :
liBinID : LongInt;
liAux : LongInt;
classID : TJPIPDatabinClass;
liCodestreamID: LongInt;
iOffset : Integer;
iLength : Integer;
arrData : TBytes;
isFinal : Boolean;
isEOR : Boolean;
isComplete : Boolean;
错误函数:
function TJPIPDataInputStream.readSegment: TJPIPDataSegment;
var
m : Integer;
id : LongInt;
seg : TJPIPDataSegment;
B : Byte;
begin
id:= readVBAS;
if id < 0 then
begin
Result:= nil;
Exit;
end;
seg:= TJPIPDataSegment.Create;
seg.liBinID:= id;
if vbasFstByte = 0 then
begin
seg.isEOR:= true;
seg.liBinID:= formMain.client.IOHandler.ReadByte;
if seg.liBinID < 0 then
ShowMessage('EOF reached before completing EOR message');
seg.iLength:= Integer(readVBAS);
end
else
begin
seg.isEOR:= false;
seg.liBinID:= seg.liBinID and (not LongInt($70 shl ((vbasLength - 1) * 7)));
seg.isFinal:= ((vbasFstByte and $10) <> 0);
m:= (vbasFstByte and $7F) shr 5;
if m = 0 then
ShowMessage('Invalid Bin-ID value format')
else if m >= 2 then
begin
classId:= readVBAS;
if m > 2 then
codestream:= readVBAS;
end;
seg.liCodestreamID:= codestream;
if classId = jpipdatabinclass.FPRECINCT_DATABIN.getStandardClassID then
seg.classID:= jpipdatabinclass.FPRECINCT_DATABIN
else if classId = jpipdatabinclass.FTILE_HEADER_DATABIN.getStandardClassID then
seg.classID:= jpipdatabinclass.FTILE_HEADER_DATABIN
else if classId = jpipdatabinclass.FTILE_DATABIN.getStandardClassID then
seg.classID:= jpipdatabinclass.FTILE_DATABIN
else if classId = jpipdatabinclass.FMAIN_HEADER_DATABIN.getStandardClassID then
seg.classID:= jpipdatabinclass.FMAIN_HEADER_DATABIN
else if classId = jpipdatabinclass.FMETA_DATABIN.getStandardClassID then
seg.classID:= jpipdatabinclass.FMETA_DATABIN;
if seg.classID = nil then
ShowMessage('Invalid databin classID');
seg.iOffset:= Integer(readVBAS);
seg.iLength:= Integer(readVBAS);
if (classId = EXTENDED_PRECINCT_DATA_BIN_CLASS) or (classId = EXTENDED_TILE_DATA_BIN_CLASS) then
seg.liAux:= readVBAS;
end;
if seg.iLength > 0 then
begin
if seg.arrData = nil then
SetLength(seg.arrData, seg.iLength);
if Length(seg.arrData) < seg.iLength then
SetLength(seg.arrData, seg.iLength);
formMain.client.IOHandler.ReadBytes(TIdBytes(seg.arrData), Length(seg.arrData));
// if inStream.read(seg.data, 0, seg.alength) <> seg.alength then
// ShowMessage('EOF reached before read' + IntToStr(seg.alength) + ' bytes');
end;
Result:= seg;
end;
函数TJPIPDataInputStream.readSegment:TJPIPDataSegment;
变量
m:整数;
id:LongInt;
seg:TJPIPDataSegment;
B:字节;
开始
id:=readVBAS;
如果id<0,则
开始
结果:=无;
出口
结束;
seg:=TJPIPDataSegment.Create;
利比尼德分段:=id;
如果vbasFstByte=0,则
开始
分段isEOR:=真;
seg.liBinID:=formMain.client.IOHandler.ReadByte;
如果利比尼分段<0,则
ShowMessage(“完成EOR消息前达到EOF”);
分段长度:=整数(readVBAS);
结束
其他的
开始
分段isEOR:=假;
利宾尼币段:=利宾尼币段和(不长($70先令((vbasLength-1)*7));
分段isFinal:=((vbasFstByte和$10)0);
m:=(vbasFstByte和$7F)shr 5;
如果m=0,则
ShowMessage('无效的Bin ID值格式')
否则,如果m>=2,则
开始
classId:=readVBAS;
如果m>2,则
码流:=readVBAS;
结束;
seg.liCodestreamID:=码流;
如果classId=JPIPDataBanClass.FPRECINCT\U DATABIN.getStandardClassID,则
seg.classID:=jpipdatabanclass.FPRECINCT\u DATABIN
否则,如果classId=jpipdatabanclass.FTILE\u HEADER\u DATABIN.getStandardClassID,则
seg.classID:=jpipdatabanclass.FTILE\u HEADER\u DATABIN
否则,如果classId=JPIPDataBanClass.FTILE_DATABIN.getStandardClassID,则
seg.classID:=jpipdatabanclass.FTILE_-DATABIN
否则,如果classId=JPIPDataBanClass.FMAIN\u HEADER\u DATABIN.getStandardClassID,则
seg.classID:=jpipdatabanclass.FMAIN\u HEADER\u DATABIN
否则,如果classId=JPIPDataBanClass.FMETA_DATABIN.getStandardClassID,则
seg.classID:=jpipdatabanclass.FMETA_-DATABIN;
如果seg.classID=nil,则
ShowMessage('Invalid databin classID');
seg.iOffset:=整数(readVBAS);
分段长度:=整数(readVBAS);
如果(classId=扩展分区数据类)或(classId=扩展分区数据类),则
seg.liAux:=readVBAS;
结束;
如果分段长度>0,则
开始
如果seg.arrData=nil,则
设置长度(分段数据、分段长度);
如果长度(seg.arrData)
arrrata为TBytes
i长度为整数
iLength=12
此外,数据长度也是12
我调试了它,输出长度是24。前12个元素为0,其他12个元素为真值。但我无法理解,我将arrData的长度设置为12,但读取后,它返回arrData的长度24
编辑它总是给出我给出的长度的x2。
TIdIOHandler.ReadBytes()
有一个可选的AAppend
参数,默认情况下为True
:
procedure ReadBytes(var VBuffer: TIdBytes; AByteCount: Integer; AAppend: Boolean = True);
这意味着读取的任何字节都将追加到现有数组的末尾。由于您预先分配了阵列,因此它的大小最终是原来的两倍
您需要:
ReadBytes()
为您分配阵列:
seg.arrData := nil;
if seg.iLength > 0 then
begin
formMain.client.IOHandler.ReadBytes(TIdBytes(seg.arrData), seg.iLength);
end;
AAppend
设置为False,这样ReadBytes()
将填充现有内存,而不是追加到内存中:
seg.arrData := nil;
if seg.iLength > 0 then
begin
SetLength(seg.arrData, seg.iLength);
formMain.client.IOHandler.ReadBytes(TIdBytes(seg.arrData), seg.iLength, False);
end;
请添加seg对象/记录的详细信息。我添加了更多信息。我调试并查看示例12 length,但它返回24:/