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