使用包含空字符的c#发送二进制POST数据


Send binary POST data with c# containing a null character

我正在尝试将msgpack数据发送到带有C#的服务器,此数据包含一个空字符在中间。因此,服务器接收到的数据在此字符处被切断,之后的任何数据都会丢失,这当然会使msgpack数据无法解包。

我曾尝试使用WebClient.UploadData发送数据,其中post数据位于命名字段("field="+data)中,而数据仅直接为msgpack字节,这两种情况都有相同的问题。我也尝试过WebRequest,结果也是一样。

在字节中循环并将空字符更改为另一个(FF),然后在web服务器上将其更改回,这是可行的,但这不是一个可行的解决方案,因为它太可能破坏数据。我还尝试运行一个PHP脚本,通过curl将相同的数据发送到服务器,我成功地获得了完整的数据、null字符及其后的所有内容。

所以我的问题是,有没有一种方法可以发送一个包含包含null字符的二进制数据的post数据的请求。

此外,使用System.Web.HttpUtility.UrlEncode对数据进行编码会使数据变得如此巨大,从而完全消除了首先使用msgpack的任何优势。

web服务器正在运行PHP 5.5,客户端现在正在mono上运行,但必须在Unity中运行。

一种可能的解决方案是在发送数据时使用以下映射:

00 -> FF F1
FF -> FF F2

在接收数据时,您将两个字节映射回原始字节。您实际上是在转义空字节。

这是一个快速而肮脏的解决方案,将使您以平均2/255个额外字节(不到1%的开销)的成本运行