我有一个行的PHP代码执行以下操作:什么是PHP Pack()函数的C#等价物?
$xml = "<xml><request>...[snipped for brevity]...</request></xml>";
$request = pack('N', (strlen($xml)+4)).$xml;
什么,这似乎做的是预先考虑的$xml
(加上4)的$xml
值长度的二进制字符串。
我该如何在C#中做到这一点?
我有一个行的PHP代码执行以下操作:什么是PHP Pack()函数的C#等价物?
$xml = "<xml><request>...[snipped for brevity]...</request></xml>";
$request = pack('N', (strlen($xml)+4)).$xml;
什么,这似乎做的是预先考虑的$xml
(加上4)的$xml
值长度的二进制字符串。
我该如何在C#中做到这一点?
它看起来像你的要求,需要由一个前缀长度字符串的单字节字符,所以在使用Unicode字符的C#中需要更多的工作。我假设你想要用UTF-8编码的XML字符串。当它被放在一起时,我们也不能使用字符串来保存请求,而是使用一个字节数组。
using System;
using System.IO;
using System.Text;
class Program
{
static void
Main(string[] args)
{
string xml = "<xml><request>...[snipped for brevity]...</request></xml>";
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;
}
}
其他的事情,这里要注意的是,与你的领导的4个字节“N”参数强制大端的PHP包()函数。因此我编写了ToBigEndian()方法来处理在任何平台上转换为big-endian。
System.IO.BinaryWriter看起来更接近匹配。
我不是一个PHP大师(已经很多年没有用过它),但是下面可能是在功能上相当接近:
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();
}
你也可以看看BitConverter类。 – 2009-10-30 01:24:56
谢谢你的回答克里斯托弗,经过一番深入研究之后,我使用了'BitConverter'方法。但无论如何表示赞赏。 – Kev 2009-10-30 01:29:59
工程处理,我忘了C#字符串是unicode。谢谢。 – Kev 2009-10-30 01:48:56