2012-07-13 4 views
2

패딩 문자 사이의 공백 문자. "오류 "를 입력 유효한 자료-64 문자열</p> <p>압축 해제 동안 오류가없는

잘 압축되지만 압축을 해제하지 않습니다. 나는 같은 문제가있는 많은 다른 예제를 살펴 봤는데, 내가 말한 것을 따르면서도 감압 할 때 아무것도 얻지 못한다고 느낀다. ;

public static string CompressData(string data) 
    { 
     byte[] bffr = Encoding.UTF8.GetBytes(data); 
     var mStream = new MemoryStream(); 
     using (var gZipStream = new GZipStream(mStream, CompressionMode.Compress, true)) 
     { 
      gZipStream.Write(bffr, 0, bffr.Length); 
     } 

     mStream.Position = 0; 

     var compressedData = new byte[mStream.Length]; 
     mStream.Read(compressedData, 0, compressedData.Length); 

     var gZipBuffer = new byte[compressedData.Length + 4]; 
     Buffer.BlockCopy(compressedData, 0, gZipBuffer, 4, compressedData.Length); 
     Buffer.BlockCopy(BitConverter.GetBytes(bffer.Length), 0, gZipBuffer, 0, 4); 
     return Convert.ToBase64String(gZipBuffer); 
    } 


    public static string DecompressData(string compressedData) 
    { 
     byte[] gZipBffr = Convert.FromBase64String(compressedData); 
     using (var mStream = new MemoryStream()) 
     { 
      int dataLength = BitConverter.ToInt32(gZipBffr , 0); 
      mStream.Write(gZipBffr , 4, gZipBffr .Length - 4); 

      var buffer = new byte[dataLength]; 

      mStream.Position = 0; 
      using (var gZipStream = new GZipStream(mStream, CompressionMode.Decompress)) 
      { 
       gZipStream.Read(buffer, 0, buffer.Length); 
      } 

      return Encoding.UTF8.GetString(buffer); 
     } 
    } 

string s = CompressData(s2.Tostring()); 
S2는 타입

XElement를 문자열을 pH DecompressData (stream2)) 다음은 압축 및 압축 해제 방법의 여기서 stream2는 유형 문자열입니다. 데이터베이스에서 nvarchar 유형 열 에 저장되며 압축하는 동안 루트 태그가 제거됩니다. 우리가 압축하면서 XML 매번 여기에 다른 학생 데이터가 기존 XML에 추가됩니다 다음 번에 피트 2012년 3월 24일 퍼센트 33.3 처럼 처음

상위 태그를 제거합니다. 이 작은 크기 잘 될 것입니다하지만, 데이터가 하나 개 이상의 학생 데이터를 얻을 때 당신은 충분한 공간을 할당하지 않기 때문에이 실패합니다 생각 -

 <student> 
     <data> 
     <name>peet</name> 
     <date>3/24/2012</date> 
     <field>Percent</field> 
     <new>33.3</new> 
     <old>10</old> 
     </data> 
    <data> 
     <name>raaz</name> 
     <date>3/24/2011</date> 
     <field></field> 
     <new>33.3</new> 
     <old>10</old> 
    </data> 
     <data> 
     <name>arya</name> 
     <date>3/24/2010</date> 
     <field></field> 
     <new>33.3</new> 
     <old>10</old> 
    </data> 
     </student> 
+0

커플 : 1 : (학자 인, 죄송합니다) - 당신이 여기에 오타가'Buffer.BlockCopy (BitConverter.GetBytes (bffer.Length), 0, gZipBuffer, 0, 4) ;''Buffer.BlockCopy (BitConverter.GetBytes (gZipBuffer.Length), 0, gZipBuffer, 0, 4); '라고 생각합니다. 2 : 당신이 압축하기 위해 전달하는 것은 무엇입니까? - 방금 당신의 메소드를 가져 와서이 Console.WriteLine (DecompressData (CompressData ("Hello"))))''을 실행하면 Hello가 오류없이 잘 인쇄됩니다. – kmp

+0

여기 압축 및 xml 데이터 압축을 풀고, 미래에 하나 더 먼저 데이터를 추가하기 전에 더 많은 데이터를 추가하기 전에 XML에 압축을 풀고 새 데이터를 다시 압축합니다. 첫 번째 2 변경 사항은 잘 작동하지만 세 번째로 추가 할 때 time decompressing fail fails – GANI

+0

XML 매개 변수가있는 호출을 질문에 추가 할 수 있습니까? – kmp

답변

2

나는 당신의 DecompressData 방법은 꽤 괜찮 아니라고 생각 당신의 버퍼.

이 방법이 효과적 일 수 있습니다. 어레이 복사본을 만드는 것보다 나은 접근법이있을 수 있습니다. 실제로 버퍼를 100보다 크게 만들어야하지만 작동을 보장하기 위해 루프를 몇 번 반복해야합니다. 제대로) : 내가 제대로 데이터베이스 (NVARCHAR 열에서 압축 된 XML 인코딩 기본 64를 저장하는 당신을 이해)하고, 그것을 꺼내 압축을 해제, 그것은에 노드를 추가하려면

public static string DecompressData(string compressedData) 
{ 
    byte[] gZipBffr = Convert.FromBase64String(compressedData); 
    using (var mStream = new MemoryStream()) 
    { 
     mStream.Write(gZipBffr, 4, gZipBffr.Length - 4);  
     mStream.Position = 0; 

     var bytes = new byte[0]; 
     using (var gZipStream = new GZipStream(mStream, 
               CompressionMode.Decompress)) 
     { 
      byte[] buffer = new byte[100]; 
      int read; 
      while((read = gZipStream.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       var newBytes = new byte[bytes.Length + read]; 
       Array.Copy(bytes, newBytes, bytes.Length); 
       Array.Copy(buffer, 0, newBytes, bytes.Length, read); 
       bytes = newBytes; 
      } 
     } 
     return Encoding.UTF8.GetString(bytes); 
    }   
} 

, 그것을 압축 그것을 다시 돌려 놓으십시오. 전화 그리고

private static void UpdateStudent(XElement data, int studentId) 
{ 
    XDocument student = ReadStudent(studentId); 
    student.Root.Add(data); 
    SaveStudent(studentId, student); 
} 

private static void SaveStudent(int studentId, XDocument data) 
{ 
    string compressed = CompressData(data.ToString()); 
    SaveStudentData(studentId, compressed); 
} 

private static XDocument ReadStudent(int studentId) 
{ 
    string data = GetStudentFromDatabase(studentId); 
    XDocument ret; 
    if (string.IsNullOrEmpty(data)) 
    { 
     ret = XDocument.Parse("<student></student>"); 
    } 
    else 
    { 
     string decompressed = DecompressData(data).TrimEnd('\0'); 
     ret = XDocument.Parse(decompressed); 
    } 
    return ret; 
} 

// These two methods would query the database but for demo, just store 
// in a static member 
private static string GetStudentFromDatabase(int studentId) 
{ 
    return _data; 
} 

private static void SaveStudentData(int studentId, string data) 
{ 
    _data = data; 
} 

private static string _data; 

: - (당신이 그를 넣어 수있는 곳 당신이 볼 수있는, 데이타베이스 호출 제외)

는 당신에게 약간의 (어쩌면) 여기에 내가 그 과정을 수행하는 노크 일부 코드가 도움하려면 내가 한 것을 : 일의

UpdateStudent(XElement.Parse("<data><name>peet</name><date>3/24/2012</date><field>Percent</field><new>33.3</new><old>10</old></data>"), 1); 
UpdateStudent(XElement.Parse("<data><name>raaz</name><date>3/24/2011</date><field></field><new>33.3</new><old>10</old></data>"),1); 
UpdateStudent(XElement.Parse("<data><name>arya</name><date>3/24/2010</date><field></field><new>33.3</new><old>10</old></data> "), 1); 
+0

고마워요. – GANI