Похоже, что вашему запросу требуется строка с префиксом длины, состоящая из однобайтовых символов, поэтому потребуется немного больше работы в C #, который использует символы Unicode. Я предполагаю, что вы хотите, чтобы ваша строка XML была закодирована с помощью UTF-8. Мы также не сможем использовать строку для хранения запроса, когда он составлен, вместо этого мы будем использовать байтовый массив.
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;
}
}
Еще одна вещь, на которую следует обратить внимание, это то, что функция php pack () с параметром 'N' заставляет big-endian старших 4 байта. Поэтому я написал метод ToBigEndian () для обработки преобразования в big-endian на любой платформе.