什么是PHP Pack()函数的C#等价物?

我有一行PHP代码执行以下操作:

$xml = "...[snipped for brevity]..."; $request = pack('N', (strlen($xml)+4)).$xml; 

这似乎做的是将$xml (加4)长度的二进制字符串添加到$xml的值。

我如何在C#中完成相同的操作?

看起来您的请求需要一个由单字节字符组成的长度前缀字符串,因此在C#中需要使用Unicode字符的更多工作。 我假设你想要用UTF-8编码的XML字符串。 当我们将它放在一起时,我们也无法使用字符串来保存请求,而是使用字节数组。

 using System; using System.IO; using System.Text; class Program { static void Main(string[] args) { string xml = "...[snipped for brevity]..."; using ( MemoryStream stream = new MemoryStream() ) { using ( BinaryWriter writer = new BinaryWriter(stream) ) { byte [] encodedXml = Encoding.UTF8.GetBytes(xml); writer.Write(ToBigEndian(encodedXml.Length + 4)); writer.Write(encodedXml); } byte [] request = stream.ToArray(); // now use request however you like } } static byte [] ToBigEndian(int value) { byte [] retval = BitConverter.GetBytes(value); if ( BitConverter.IsLittleEndian ) { Array.Reverse(retval); } return retval; } } 

另一件需要注意的是,带有’N’参数的php pack()函数强制在前4个字节上使用big-endian。 因此,我编写了ToBigEndian()方法来处理在任何平台上转换为big-endian的方法。

System.IO.BinaryWriter看起来更接近匹配。

我不是PHP大师(多年来没有使用它),但以下function可能非常接近:

 using System.IO; using System.Text; string xml = "the original data to pack"; using (MemoryStream ms = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(ms)) { byte[] data = Encodings.ASCII.GetBytes(xml); bw.Write((Int32)data.Length + 4); // Size of ASCII string + length (4 byte int) bw.Write(data); } request = ms.ToArray(); }