解压从c#发送到PHP的字符串
这是一个函数,用于压缩要发送到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()) {
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变体,如中所述
如果可能的话,将压缩后的数据作为二进制数据而不是URL编码的表单参数发布会更有效(就传输的数据而言)。谢谢john,但这不是我的代码,我将用PHP解压结果。您的意思是使用:stringbase64=Convert.ToBase64String(byteArray);而不是将字符数组转换成字符串?@user874557:那么就没有希望了。您介绍的C#代码极有可能丢失数据。我在c#中不是很好,所以你可以告诉我如何压缩字符串数据,以及如何通过gzuncompress或gzdecode在PHP中对其进行解压缩,因为我在一个似乎丢失数据的函数上尝试了所有这些方法GzipStream是向压缩数据添加头还是类似于gzcompress?@user874557:我不希望它添加头标题,但您所介绍的代码中的主要问题不在压缩中,而是在二进制数据的转换中。