我要将一个字符串压缩后存储在SQL的数据库里面!当存储成功过后!再次提出数据好像少了一些不可见的字符。请问怎么解决。
以下为压缩和解压缩的的两个函数:
function TForm1.CompressString(const S: string): string;
var
  InputStream: TCompressionStream;
  OutputStream: TMemoryStream;
  Size, i: Integer;
begin
  OutputStream := TMemoryStream.Create;
  try
    InputStream := TCompressionStream.Create(clMax, OutputStream);
    try
      Size := Length(S);
      InputStream.Write(s[1], Size)
    finally
      InputStream.Free;
    end;
    SetLength(Result, OutputStream.Size);
    OutputStream.Seek(0, soFromBeginning);
    OutputStream.Read(Result[1], Length(Result))
  finally
    OutputStream.Free;
  end
end;function TForm1.DecompressString(const S: string): string;
var
  InputStream: TMemoryStream;
  OutputStream: TDecompressionStream;
  Size: Integer;
begin
  InputStream := TMemoryStream.Create;
  try
    InputStream.Write(S[1], Length(S));
    InputStream.Seek(0, soFromBeginning);
    OutputStream := TDecompressionStream.Create(InputStream);
    try
      SetLength(Result, Size);
      OutputStream.Read(Result[1], Size)
    finally
      OutputStream.Free
    end
  finally
    InputStream.Free
  end;
end;

解决方案 »

  1.   

    要存原始长度的,不然解压不了 :(function TForm1.CompressString(const S: string): string;
    var
      InputStream: TCompressionStream;
      OutputStream: TMemoryStream;
      Size, i: Integer;
    begin
      OutputStream := TMemoryStream.Create;
      try
        //要把原始大小写进去,不然TDecompressionStream无法得到原始大小
        Size := Length(S);
        OutputStream.Write(Size, SizeOf(Size));
        InputStream := TCompressionStream.Create(clMax, OutputStream);
        try
          InputStream.Write(s[1], Size)
        finally
          InputStream.Free;
        end;
        SetLength(Result, OutputStream.Size);
        OutputStream.Seek(0, soFromBeginning);
        OutputStream.Read(Result[1], Length(Result))
      finally
        OutputStream.Free;
      end
    end;function TForm1.DecompressString(const S: string): string;
    var
      InputStream: TMemoryStream;
      OutputStream: TDecompressionStream;
      Size: Integer;
    begin
      InputStream := TMemoryStream.Create;
      try
        InputStream.Write(S[1], Length(S));
        InputStream.Seek(0, soFromBeginning);
        //读出原串大小,以备在TDecompressionStream中读取大小
        InputStream.Read(Size, SizeOf(Size));
        SetLength(Result, Size);
        if Size <= 0 then
          Exit;    OutputStream := TDecompressionStream.Create(InputStream);
        try
          OutputStream.Read(Result[1], Size);
        finally
          OutputStream.Free
        end
      finally
        InputStream.Free
      end;
    end;
      

  2.   


       InputStream.Seek(0, soFromBeginning);
        //读出原串大小,以备在TDecompressionStream中读取大小
        InputStream.Read(Size, SizeOf(Size));楼上的解法对的,你原来的程序没有先读原来的流的大小。压缩流前面几个字节是储存原来流大小的。
      

  3.   

    字段类型的问题吧,改用binary类型的字段吧,这样就不会丢数据了
      

  4.   

    一般存定长的非可见字符串我用binary,不定长的用image
      

  5.   

    支持,使用二进制数据类型来存储,不能使用明确的char/nchar/varchar/varchar2/nvarchar/ntext等类型。text类型可以考虑,但是不建议使用。最好使用memo/binary等类型,当然也可以考虑使用image等。