【问题标题】:Decompression of a string sent from c# to PHP解压从 c# 发送到 PHP 的字符串
【发布时间】:2011-08-06 17:57:28
【问题描述】:

这是压缩要发送到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 但都产生数据错误任何人都知道为什么?

【问题讨论】:

    标签: c# php mysql apache compression


    【解决方案1】:

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

    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 的网络安全变体,如 Wikipedia base64 page 中所述。

    要解压,你显然需要在解压前执行 base64 到二进制的转换。

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

    【讨论】:

    • 感谢 john,但这不是我的代码,我将在 PHP 中解压缩结果。你的意思是使用:string base64 = Convert.ToBase64String(byteArray);而不是将 char 数组转换为字符串?
    • @user874557:那么就没有希望了。您提供的 C# 代码极有可能丢失数据。它必须改变。
    • 在 c# 中不太好,所以你可以告诉我如何压缩字符串数据,还可以通过 gzuncompress 或 gzdecode 在 PHP 中解压缩它,因为我已经在似乎丢失数据的函数
    • GzipStream 是在压缩数据中添加标头还是像 gzcompress 一样?
    • @user874557:我不希望它添加标头,但是您提供的代码中的主要问题不在于压缩 - 它们是在转换为二进制然后从二进制转换数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 2013-01-16
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多