0

我创建了一个简单的程序。

我创建一个字符串并通过以下方法对其进行压缩,并将其存储在 sql server 2008 中的二进制数据字段类型(binary(1000)字段类型)中。

当我读取二进制数据和结果字符串时,它就像具有相同长度和数据的原始字符串数据一样,但是当我想解压缩它时,它给了我一个错误。

我使用这种方法来获取字节:

 System.Text.ASCIIEncoding.ASCII.GetBytes(mystring)

而这种获取字符串的方法:

System.Text.ASCIIEncoding.ASCII.GetString(binarydata)

在 VS2012 编辑器的硬代码中,结果字符串工作正常,但是当我从 sql 读取它时,它在解压方法的第一行给我这个错误:

 The input is not a valid Base-64 string as it contains a
 non-base 64 character, more   than two padding characters, 
 or a non-white space character among the padding characters.

我的代码有什么问题?这两个字符串是相同的,但是

string test1=Decompress("mystring");

...此方法工作正常,但这给了我错误并且无法解压缩检索到的字符串

string temp=System.Text.ASCIIEncoding.ASCII.GetString(get data from sql) ;
string test2=Decompress(temp);

比较这些字符串不显示任何尊重

int result = string.Compare(test1, test2); // result=0

我的压缩方法:

   public static string Compress(string text)
   {
       byte[] buffer = Encoding.UTF8.GetBytes(text);
       var memoryStream = new MemoryStream();
       using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress, true))
       {
           gZipStream.Write(buffer, 0, buffer.Length);
       }

       memoryStream.Position = 0;

       var compressedData = new byte[memoryStream.Length];
       memoryStream.Read(compressedData, 0, compressedData.Length);

       var gZipBuffer = new byte[compressedData.Length + 4];
       Buffer.BlockCopy(compressedData, 0, gZipBuffer, 4, compressedData.Length);
       Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gZipBuffer, 0, 4);
       return Convert.ToBase64String(gZipBuffer);
   }

我的解压方法:

   public static string Decompress(string compressedText)
   {
       byte[] gZipBuffer = Convert.FromBase64String(compressedText);
       using (var memoryStream = new MemoryStream())
       {
           int dataLength = BitConverter.ToInt32(gZipBuffer, 0);
           memoryStream.Write(gZipBuffer, 4, gZipBuffer.Length - 4);

           var buffer = new byte[dataLength];

           memoryStream.Position = 0;
           using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
           {
               gZipStream.Read(buffer, 0, buffer.Length);
           }

           return Encoding.UTF8.GetString(buffer);
       }
   }
4

1 回答 1

2

最可能的问题是您从 SQL 二进制文件中获取字符串的方式。

目前(我猜,您还没有展示如何从 SQL 存储或检索数据)

  • 压缩:Text -> UTF8.GetBytes -> compress -> base64 string-> Send to Sql (transformed to binary)
  • 解压:Binary -> String representation of binary -> base64 decode -> decompress -> UTF8.GetString

您的问题是String representation of binary步骤与Send to Sql (transformed to binary). 如果您将其存储为 avarbinary您应该从 compress 和 decompress 返回字节数组应该接受一个字节数组。

public byte[] string Compress(string text)
{
  //Snip
}

public static string Decompress(byte[] compressedText)
{
   //Snip
}

这会将您的流程更改为

  • 压缩:Text -> UTF8.GetBytes -> compress -> Send to Sql
  • 解压:Binary -> decompress -> UTF8.GetString
于 2012-11-06T15:55:27.853 回答