解压从c#发送到PHP的字符串

解压从c#发送到PHP的字符串,c#,php,mysql,apache,compression,C#,Php,Mysql,Apache,Compression,这是一个函数,用于压缩要发送到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()) {

这是一个函数,用于压缩要发送到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,但都会产生数据错误,任何人都知道原因。

这段代码从一开始就很奇怪:

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
  • 执行压缩(不,这里的刷新不应该引起问题,尽管您也应该关闭—最好是通过
    使用
    语句)
  • 使用base64将二进制数据转换回文本(假设确实需要)。如果要将其用作URL参数,则应使用web安全的base64变体,如中所述
要解压缩,显然需要在解压缩之前执行base64到二进制的转换


如果可能的话,将压缩后的数据作为二进制数据而不是URL编码的表单参数发布会更有效(就传输的数据而言)。

谢谢john,但这不是我的代码,我将用PHP解压结果。您的意思是使用:stringbase64=Convert.ToBase64String(byteArray);而不是将字符数组转换成字符串?@user874557:那么就没有希望了。您介绍的C#代码极有可能丢失数据。我在c#中不是很好,所以你可以告诉我如何压缩字符串数据,以及如何通过gzuncompress或gzdecode在PHP中对其进行解压缩,因为我在一个似乎丢失数据的函数上尝试了所有这些方法GzipStream是向压缩数据添加头还是类似于gzcompress?@user874557:我不希望它添加头标题,但您所介绍的代码中的主要问题不在压缩中,而是在二进制数据的转换中。