这是将要发送到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但是所有人都知道为什么会产生数据错误?
答案 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编码的文本中有特殊含义。不要这样做。
基本上,你应该:
using
声明)要解压缩,您显然需要在解压缩之前执行base64到二进制转换。
如果可能的话,将压缩数据作为二进制数据而不是作为URL编码的表单参数发布会更有效(就传输的数据而言)。