簡単なプログラムを作成しました。
文字列を作成し、次の方法で圧縮し、SQL Server 2008 のバイナリ データ フィールド型 (binary(1000)
フィールド型) に格納します。
そのバイナリ データと結果文字列を読み取ると、同じ長さとデータを持つ元の文字列データのように true になりますが、解凍するとエラーが発生しました。
このメソッドを使用してバイトを取得します。
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.
コードの何が問題になっていますか? これら 2 つの文字列は同じですが、
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);
}
}