i := AContext.Connection.Socket.InputBuffer.Size;
    //s := '收到字节:' + inttostr(i);
    //ReceText := s;
    //TIdSync.SynchronizeMethod(InputLogBox);
    //TIdSync.SynchronizeMethod(SetMemoTextRece);
    if i < 1 then exit;    AContext.Connection.Socket.ReadBytes(FRecvBuffer, i, false);
    setlength(s, i + 1);
    move(FRecvBuffer[0], s[1], i);    if length(s) > 2 then Delete(s, Pos(#13, s), 1);
    if length(s) > 2 then Delete(s, Pos(#10, s), 1);
    if length(s) > 1 then Delete(s, Pos(#0, s), 1);即使这样的执行,还有一个特殊符号(€),怎么都去不掉。在 TXT文本里打开,是一个黑色的大黑块显示。在EDITPLUS里,看到的就是(€)。我也不知道是啥玩意,各位高手,这是啥东西,怎么去掉啊?
在不改变读取字符串方式的情况下……

解决方案 »

  1.   

    procedure TFormIndex.IdTCPServerExecute(AContext: TIdContext);
    var
      i: integer;
      FRecvBuffer: TBytes;
      s: string;
    begin
    {数据接收事件}
      try
        i := AContext.Connection.Socket.InputBuffer.Size;
        //s := '收到字节:' + inttostr(i);
        //ReceText := s;
        //TIdSync.SynchronizeMethod(InputLogBox);
        //TIdSync.SynchronizeMethod(SetMemoTextRece);
        if i < 1 then exit;    AContext.Connection.Socket.ReadBytes(FRecvBuffer, i, false);
        setlength(s, i + 1);
        move(FRecvBuffer[0], s[1], i);    if length(s) > 2 then Delete(s, Pos(#13, s), 1);
        if length(s) > 2 then Delete(s, Pos(#10, s), 1);
        if length(s) > 1 then Delete(s, Pos(#0, s), 1);
        if s = '' then exit;
    在完整点吧!
      

  2.   

    刚刚测试了AContext.Connection.Socket.ReadBytes(FRecvBuffer, i, false); 
    setlength(s, i + 1); <---如果修改成setlength(s, i);就不会出问题!,请教高手,这样做存在风险么?move(FRecvBuffer[0], s[1], i); 
      

  3.   

    应该就是setlength(s, i + 1); 这里的问题,因为多读了一个长度的数据。删除不掉……如果只读setlength(s, i);正好的数据,就不会出错。但是,为什么要多读一个呢?有什么道理呢?如果不多读又会如何呢?
    还请高手们赐教! 
      

  4.   

    自己的问题自己解决吧!
    感谢CSND里某个大哥的热心帮助。我的心得拿出来分享    {字符串读取}
        //setlength(s, i);
        //move(FRecvBuffer[0], s[1], i);
        {pchar读取}
        pc := allocmem(i + 1);
        Move(FRecvBuffer[0], pc^, i);
        s := string(pc);
        freemem(pc);为啥String不加1?答:因为 STRING变量时动态数组。
    为啥PCHAR要加1?答:因为必须留出一个长度出来,添加#0。这样才算读完了。不然 就一直读到死为止!