Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi TIdTCPClient读取字节数_Delphi - Fatal编程技术网

Delphi TIdTCPClient读取字节数

Delphi TIdTCPClient读取字节数,delphi,Delphi,Seg参数: liBinID : LongInt; liAux : LongInt; classID : TJPIPDatabinClass; liCodestreamID: LongInt; iOffset : Integer; iLength : Integer; arrData : TBytes; isFinal : Boolean; isEOR :

Seg参数:

  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:/