Что такое эквивалент C # функции PHP Pack ()? - PullRequest
0 голосов
/ 30 октября 2009

У меня есть строка кода PHP, которая делает следующее:

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

То, что это делает, это добавляет двоичную строку длиной $xml (плюс 4) к значению $xml.

Как мне сделать эквивалент в C #?

Ответы [ 2 ]

1 голос
/ 30 октября 2009

Похоже, что вашему запросу требуется строка с префиксом длины, состоящая из однобайтовых символов, поэтому потребуется немного больше работы в 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 на любой платформе.

1 голос
/ 30 октября 2009

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...