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

时间:2011-08-06 17:57:28

标签: 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())
        {
            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但是所有人都知道为什么会产生数据错误?

1 个答案:

答案 0 :(得分: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将二进制数据转换回文本(假设您确实必须)。如果您要将此作为URL参数使用,则应使用base64的Web安全变体,如Wikipedia base64 page中所述。

要解压缩,您显然需要在解压缩之前执行base64到二进制转换。

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