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