2009-10-30 120 views
0

我有一个行的PHP代码执行以下操作:什么是PHP Pack()函数的C#等价物?

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

什么,这似乎做的是预先考虑的$xml(加上4)的$xml值长度的二进制字符串。

我该如何在C#中做到这一点?

回答

1

它看起来像你的要求,需要由一个前缀长度字符串的单字节字符,所以在使用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。

+0

工程处理,我忘了C#字符串是unicode。谢谢。 – Kev 2009-10-30 01:48:56

1

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(); 
} 
+0

你也可以看看BitConverter类。 – 2009-10-30 01:24:56

+0

谢谢你的回答克里斯托弗,经过一番深入研究之后,我使用了'BitConverter'方法。但无论如何表示赞赏。 – Kev 2009-10-30 01:29:59

相关问题