PHP Paketi () fonksiyonunun C # eşdeğer nedir?

2 Cevap

Ben şunları yapar PHP kodu bir çizgi var:

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

Bu ne görünür, başına $xml uzunluğu (artı 4) $xml değerine bir ikili dizisidir.

Ben bu eşdeğer C # nasıl yapabilirim?

2 Cevap

İsteğiniz tek bayt karakterlerden oluşan bir uzunluk öneki dize gerektirir gibi görünüyor, bu yüzden olacak Unicode karakterleri kullanır C # biraz daha fazla çalışma ihtiyacı olacak. Ben UTF-8 ile kodlanmış XML sizin dize istiyorum kabul edeceğim. Biz de onun araya edildiği zaman, bunun yerine bir bayt dizisi kullanacağız, isteği tutmak için bir dize kullanmak mümkün olmayacaktır.

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;
    }
}

Burada dikkat edilmesi gereken başka bir şey olduğunu da önde gelen 4 bayt 'N' parametresi güçleri büyük endian ile php pack () fonksiyonu. Bu nedenle herhangi bir platformda büyük endian içine dönüşüm işlemek için ToBigEndian () yöntemini yazdı.

System.IO.BinaryWriter daha yakın bir maç gibi görünmektedir.

Ben (yıldır kullanmış değil) PHP gurusu değilim, ama şu muhtemelen işlevselliği oldukça yakın:

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