Распаковка строки, отправленной из c # в PHP - PullRequest
0 голосов
/ 06 августа 2011

Это функция, которая архивирует строку для отправки в 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 Ответ

2 голосов
/ 06 августа 2011

Этот код странен для начала:

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 .

Для распаковки вам, очевидно, потребуется выполнить преобразование base64 в двоичное перед распаковкой.

Если возможно, было бы значительно более эффективно (с точки зрения переданных данных) публиковать сжатые данные как двоичные данные , а не как параметр формы в кодировке URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...