现在做一个使用SOCKET组件,发送BCD码和接受BCD码的程序,具体怎样发送和接受BCD码,要先把一组BCD码放到数组中,然后具体怎样做呢?

解决方案 »

  1.   

    压缩bcd还是非压缩bcd?非压缩bcd把数字变成对应的字符即可,用IntToStr函数转换就行了,反向就是StrToInt函数
    压缩bcd在转换后,在字符拼接一下,
      

  2.   

    例如:
    function ToBCD(x:integer):string;
    var
      sBCD:string;    //压缩BCD
    begin
      Result := '';
      if x<0 then
        exit;  Result := IntToStr(x);  //转换成非压缩BCD码
      
      sBCD := '';
      for i := 1 to (Length(Result) div 2) do
        sBCD := sBCD  + Chr((StrToInt(Result[i*2-1]) shl 4)+StrToInt(Result[i*2]));  Result := sBCD; 
    end;
      

  3.   

    前面忘了声明i为integer型。下面是反向函数:function FromBCD(x:string):integer;
    var
      sBCD:string;    
    begin
      Result := -1;
      if x='' then
        exit;  sBCD := '';
      for i := 1 to Length(x) do
        try
          sBCD := sBCD  + Chr((StrToInt(x[i]) and $F0) shl 4) and Chr(StrToInt(x[i]) and $0F)
        except
          exit;
        end;  Result := StrToInt(sBCD);  
    end;
      

  4.   

    现在可以发送,但是用SOCKET发送$00时不能接受到。
      

  5.   

    为什么要发nil阿其他收发都正常了?
      

  6.   

    你用的什么发送函数?SendBuffer?
      

  7.   

    是的,用这个ClientSocket.ReceiveBuf(DAta,sizeof(data))接受
      

  8.   

    我要用SOCKET接受发送16进制数,谁做过,讲讲吧。
      

  9.   

    我几个函数都试过了,0除了用特殊值没有别的办法,她始终认为是nil,我建议用$FF代替$0顺便说一句,#0只是一种表达方式,她其实就是$30,只是后来想想30也是个常用的数字,而$FF不可能在BCD里出现,可以用来表示特殊意思
      

  10.   

    无论你把她看成什么,Socket都把她看成字符串啊
      

  11.   

    我们传的就是BCD码,所以从0到FF都有可能的,代替好像行不通。
      

  12.   

    你转换函数里加句if不就可以了function ToBCD(x:integer):string;
    var
      sBCD:string;    //压缩BCD
    begin
      Result := '';
      if x<0 then
        exit;
      if x=0 then
      begin
        Result := #$FF;
        exit;
      end;  Result := IntToStr(x);  //转换成非压缩BCD码
      
      if Length(Result) mod 2=1 then
        Result := '0'+Result;  sBCD := '';
      for i := 1 to (Length(Result) div 2) do
        sBCD := sBCD  + Chr((StrToInt(Result[i*2-1]) shl 4)+StrToInt(Result[i*2]));  Result := sBCD; 
    end;function FromBCD(x:string):integer;
    var
      sBCD:string;    
    begin
      Result := -1;
      if x='' then
        exit;
      if x=#$FF then
      begin
        x := 0;
        exit;
      end;  sBCD := '';
      for i := 1 to Length(x) do
        try
          sBCD := sBCD  + Chr((StrToInt(x[i]) and $F0) shl 4) and Chr(StrToInt(x[i]) and $0F)
        except
          exit;
        end;  Result := StrToInt(sBCD);  
    end;
      

  13.   

    Socket都把她看成字符串,但是我不能直接传字符串啊。
      

  14.   

    我从来没听说过,BCD码怎么可能出现$FF?BCD码是十进制的一种表示方式啊,她又不是16进制
      

  15.   

    哈哈,现在我们可以收到的,只是在收到的时候要做成定长的,不能用SIZEOF取变长的数据。否则就不能取出正确的数据。
      

  16.   

    感觉你概念不清啊$97理解成字符就是'a',理解成数字就是151,理解成BCD就是97所有的东西缺别只是理解问题啊
      

  17.   

    ClientSocket.ReceiveBuf(DAta,t);可以取到发送的OO,但是只能是定长,变长的就报错。
      

  18.   

    $97理解成字符就是'a',理解成数字就是151,理解成BCD就是97,是啊,$97就是16进制的。
      

  19.   

    用BUFFER作为单位的通信的确不可以变长的,Data的类型必须是可以预知长度的类型,否则一定会出错。其实你自己也可以想象一下,如果变长的话,怎么去理解数据那?但如果只是字符串这么简单的数据可以考虑用SendText和ReceiveText函数,这个就可以变长了,因为她知道每个单位的长度,总长度就不重要了。一般传结构的时候采用SendBuf和ReceiveBuf,这样可以传比较复杂的数据
      

  20.   

    但是我用采用SendBuf和ReceiveBuf时,接受到了用这个可以判断长度sizeof但是ClientSocket.ReceiveBuf(DAta,t);时就报错了。
      

  21.   

    谢谢你的回答,问题还没有解决,晚上继续吧。哀,希望能够解决。发送:
    clientsocket1.socket.SendBuf(cf1^,count);读取:
    count:=socket.ReceiveLength;
    getmem(cf1,count);
    socket.ReceiveBuf(cf1^,count);
    我运行到socket.ReceiveBuf(cf1^,count);报错。
      

  22.   

    我写Socket只写过比较简单的,
    一般我把两端的类型都设为ctNonBlocking,
    然后两边都定义一个一样的结构,当然这个结构的大小肯定是预知的,SizeOf出来的肯定是个固定值,
    然后在Client端的OnConnect里发数据:Socket.SendBuf(recData,SizeOf(recData));
    然后在Server端的OnClientConnect里收数据,Socket.ReceiveBuf(recData,SizeOf(recData));
    Server端就在OnClientConnect里处理完数据,Socket.SendBuf(recData,SizeOf(recData));
    如果在外面处理的话要把SocketId记录下来,到时候到ServerSocket.Socket.Connections[i].SendBuf(recData,SizeOf(recData)),在connections数组里根据SocketId去找相应的连接;
    然后再Client端的OnRead里,读取返回:Socket.ReceiveBuf(recData,SizeOf(recData));
    我觉得你和我情况不太一样,首先你传递的是长度不固定的字符串,所以建议你用SendText方法和ReceiveText方法;
    整个通信流程估计还是差不多的吧,应该可以借鉴;明天如果我有时间会试一下你这个功能,我晚上不在网上,msn加你了,我上班时间都在祝你好运
      

  23.   

    前面忘了写,在发数据的时候,Client端要Open一下,等连接通了她就去走OnConnet了,在OnRead里要Close一下,这样连接才不会越来越多
      

  24.   

    clientsocket1.socket.SendBuf(cf1^,count);读取:
    count:=socket.ReceiveLength;
    getmem(cf1,count);
    socket.ReceiveBuf(cf1^,count);
    我运行到socket.ReceiveBuf(cf1^,count);报错
    程序应该怎样更改呢?
      

  25.   

    我很是感谢alfsnow(丰子) ,谢谢了。