将二进制转换为字符串不起作用

时间:2012-11-06 15:20:44

标签: c#

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

我创建一个字符串并通过以下方法对其进行压缩,并将其存储在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);
       }
   }

1 个答案:

答案 0 :(得分: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)不同。如果你将它存储为varbinary,你应该从压缩返回字节数组,解压缩应该采用字节数组。

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