2011-08-06 63 views
0

這是壓縮的串的功能被髮送到PHP代碼減壓串的從C#發送到PHP

public string Zip(string value) 
    { 
     //Transform string into byte[] 
     byte[] byteArray = Encoding.UTF8.GetBytes(value); 
     int indexBA = 0; 
     foreach (char item in value.ToCharArray()) 
     { 
      byteArray[indexBA++] = (byte)item; 
     } 
     //Prepare for compress 
     System.IO.MemoryStream ms = new System.IO.MemoryStream(); 
     System.IO.Compression.GZipStream sw = new System.IO.Compression.GZipStream(ms, 
     System.IO.Compression.CompressionMode.Compress); 
     //Compress 
     sw.Write(byteArray, 0, byteArray.Length); 
     //Close, DO NOT FLUSH cause bytes will go missing... 
     sw.Close(); 
     //Transform byte[] zip data to string 
     byteArray = ms.ToArray(); 
     System.Text.StringBuilder sB = new System.Text.StringBuilder(byteArray.Length); 
     foreach (byte item in byteArray) 
     { 
      sB.Append((char)item); 
     } 
     ms.Close(); 
     sw.Dispose(); 
     ms.Dispose(); 
     return sB.ToString(); 
    } 

和正在發送用

string data = req.Zip(xml); 
     string resp = req.post(url,"&Data="+data); 

我試圖使用請求gzuncompress,gzdecode但所有產生數據錯誤任何機構知道爲什麼?

回答

2

此代碼是奇怪入手:

byte[] byteArray = Encoding.UTF8.GetBytes(value); 
int indexBA = 0; 
foreach (char item in value.ToCharArray()) 
{ 
    byteArray[indexBA++] = (byte)item; 
} 

您使用UTF-8編碼...和然後你覆蓋該數組中的內容(將其轉換爲一個字節數組或至少某些該數組的內容)通過將每個字符轉換爲一個字節 - 這是有效地應用ISO-Latin-1編碼。

再後來,你要轉換任意的二進制數據爲一個字符串像這樣:

byteArray = ms.ToArray(); 
System.Text.StringBuilder sB = new System.Text.StringBuilder(byteArray.Length); 
foreach (byte item in byteArray) 
{ 
    sB.Append((char)item); 
} 

不要那樣做。這是不透明的二進制數據 - 您正在創建的「字符串」(再次,通過ISO-8859-1有效創建)可以正確傳輸的機會非常渺茫。

當作爲一個字符串編碼任意的二進制數據,你應該總是使用Base64編碼:

string base64 = Convert.ToBase64String(byteArray); 

然後使用數據以URL編碼形式的數據你 - 儘管字符串可以很容易地包含在URL編碼文本中具有特殊含義的字符,如&%。不要那樣做。

基本上,你應該:

  • 選擇要使用的初始文本到二進制的轉換,其編碼。 UTF-8在這裏是一個不錯的選擇,因爲它可以代表所有的Unicode。
  • 執行壓縮(不,在這裏沖洗應該造成問題,但你也應該密切反正 - 通過using聲明理想情況下)
  • 轉換二進制數據迴文本使用(假設你真的有) BASE64。如果您要將其用作網址參數,則應使用網址安全版本的base64,如Wikipedia base64 page中所述。

要進行解壓縮,顯然需要在解壓縮之前執行base64到binary的轉換。

如果可能的話,將壓縮數據作爲二進制數據而不是作爲URL編碼形式參數發佈將顯着更高效(就傳輸的數據而言)。

+0

感謝john,但它不是我的代碼,我會解壓縮PHP中的結果。 你是否打算使用: string base64 =轉換。ToBase64String(byteArray);而不是將char數組轉換爲字符串? –

+0

@ user874557:那就沒有希望了。您提交的C#代碼非常可能會丟失數據。它**必須**被改變。 –

+0

在C#中不是很好,所以你可以告訴我如何壓縮字符串數據,也可以通過gzuncompress或gzdecode在PHP中解壓它,因爲我已經嘗試了所有這些功能,似乎丟失了數據 –