有什么办法能将很多不同类型的转化为二进制类型的呢,比如说有integer、string、record。
在下使用流的形式,可是遇到问题。mStream为TMemoryStream类型。          
         temp:=10001;
         mStream.WriteBuffer('123456789',Length('123456789'));
         mStream.WriteBuffer(temp,sizeof(Integer));
          mStream.Position:=0;
          Memo1.Lines.LoadFromStream(mStream);
      程序中Memo1的显示123456789*也就是说第一个WriteBuffer可以读到,第二读不到。
如果有记录体那该如何处理呢?
我的程序是把包体的很多数据转化为二进制,然后进行包体校验和计算,请各位帮忙呀,分不够可以再商量呀。

解决方案 »

  1.   

    因为Memo的Text是string类型的,你读出来的数据,一旦遇到#0,就认为是string结束了。
    你可以把temp的值换为$61616161验证一下
      

  2.   


    var
      temp : Integer;
      mStream: TMemoryStream;
    begin
      temp := $61616161;
      mStream := TMemoryStream.Create;
      mStream.WriteBuffer('123456789',Length('123456789'));
      mStream.WriteBuffer(temp,sizeof(Integer));
      mStream.Position:=0;
      Memo1.Lines.LoadFromStream(mStream);{Memo1显示为123456789aaaa}
      mStream.Free;
    end;
      

  3.   

    很感谢lihuasoft(◆青天白日满地红◆)的热情指导,我知道我错在哪里了。如果是record,按照我程序的结构去存取就可以吗?我明天试试,各位大哥也给小弟提提意见呀
      

  4.   

    不,不是你描述的意思,而是3楼的意思:写进流本身没有问题,但你试图把流中的数据用字符串显示到memo中,就有点勉为其难了。因为(原因在一楼),比如象你给出的1001这个整数,它在内存中就是E9 03 00 00这样4个字节,当你把它们直接视为字符串显示到memo中时,就只能显示ASCII码为E9和03的这两个字符了(具体是什么字符,你查ASCII码表),然后00字节后面的所有字节,都被视为不属于这个“字符串”。
    而对于Integer等类型来说,它一定是会产生许多的值为00的字节的...所以:
    你把数据放到流里是没错的,但你不能把流里的数据解释为字符串来使用。
      

  5.   

    如果你用record(前题是record如有string成员,它需要是固定长度的)或其他方法,把存在流中的数据分别还原为它原来的类型使用,当然是可以的。
      

  6.   

    嗯嗯,谢谢各位的热情帮忙。还有最后一个问题。
    我把读取的内存流内容要给一下函数去操作,我该怎么处理呢??function CalCheckSum(pkg:array of byte):Integer;
    var checksum:Integer;
        i,idx:Integer;
    begin
      checksum:=0;
      i:=0;
      for idx:= 0 to Length(pkg)-1 do
      begin
        i := pkg[idx] ;
        if (idx mod 2 =1)  then
          begin
            i := ( i shl 8 ) and $ff00 ;
          end
        else
          begin
            i := i and $ff ;
          end;
          checksum := checksum + i ;
        end;
        Result:= checksum;
    end;
      

  7.   

    先将内存流转换为字节流        
            var    bBytes:array of Byte;
            SetLength(bBytes,0);
            SetLength(bBytes,mStream.Size);
            mStream.Position:=0;
            mStream.ReadBuffer(bBytes[0],mStream.Size);
            mStream.Clear;
            CalCheckSum(bBytes);