Как бросить меч в байтовый массив в C # - PullRequest
0 голосов
/ 28 марта 2009

Как вы уже знаете, я перехожу на C #, и некоторые вещи в C ++ выглядят по-другому.

C ++ код

    BYTE packetBuffer[32] = {0};
    *(LPWORD)(packetBuffer + 0) = 0xC;
    *(LPWORD)(packetBuffer + 2) = 0x5000;
    *(LPDWORD)(packetBuffer + 6) = dwArgs[13];
    *(LPDWORD)(packetBuffer + 10) = *(keyArray2 + 0);
    *(LPDWORD)(packetBuffer + 14) = *(keyArray2 + 1);

Примечание. DwArgs и keyArray2 - это "массив DWORD"

Вот как это расположено

  1. пакетный буфер [0] будет 0xC
  2. пакетный буфер [1] будет 0x00
  3. пакетный буфер [2] будет 0x50
  4. пакетный буфер [3] будет 0x00

и т. Д.

Как это сделать в C #?

Я пробовал это, но это не работает

packetBuffer[0] = 0xC;
packetBuffer[2] = (byte)0x5000; //error
packetBuffer[6] = (byte)dwArgs[13];

Ответы [ 2 ]

2 голосов
/ 28 марта 2009

Вы можете использовать BitConverter для преобразования данных в байтовые массивы и из них. К сожалению, нет возможности скопировать в существующий массив. Моя собственная EndianBitConverter в моей библиотеке MiscUtil позволяет это, если вам это нужно, а также позволяет указывать порядковый номер для использования, конечно. (BitConverter обычно является прямым порядком байтов в .NET - вы можете проверить его с помощью поля IsLittleEndian.)

Например:

EndianBitConverter converter = EndianBitConverter.Little;
converter.CopyBytes((short) 0xc, packetBuffer, 0);
converter.CopyBytes((int) 0x5000, packetBuffer, 2);
converter.CopyBytes(dwArgs[13], packetBuffer, 6);

и т.д.. Приведение к int во втором вызове CopyBytes является избыточным, но включено для ясности (с учетом предыдущей строки!).

РЕДАКТИРОВАТЬ: Другая альтернатива, если вы предпочитаете использовать стандартные библиотеки .NET, вы можете использовать BinaryWriter с MemoryStream.

0 голосов
/ 28 марта 2009

Вы не можете. C # строго типизирован. Переменная имеет один и только один тип. Обман, как в C ++ reinterpret_cast, не разрешен.

Есть несколько подходов к вашей проблеме. Первое и очевидное - использовать встроенную платформу сериализации. Не беспокойтесь о написании собственного кода сериализации, если это не нужно. А в .NET вам не часто приходится.

Во-вторых, использовать класс BitConverter (метод GetBytes должен помочь при преобразовании в байтовый массив)

...