0

簡単なプログラムを作成しました。

文字列を作成し、次の方法で圧縮し、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);
       }
   }
4

1 に答える 1

2

The most likely issue is the way you are getting the string from the SQL binary filed.

Currently (I guess, you have not showed how you stored or retrieved your data from SQL)

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

Your issue is the String representation of binary step is not the same as the Send to Sql (transformed to binary). If you are storing this as a varbinary you should be returning the byte array from compress and decompress should take in a byte array.

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

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

this changes your process to

  • Compress : Text -> UTF8.GetBytes -> compress -> Send to Sql
  • Decompress: Binary -> decompress -> UTF8.GetString
于 2012-11-06T15:55:27.853 に答える