2009-03-28 1 views
0

Как вы уже знаете, я перехожу на C#, а некоторые вещи на C++ выглядят иначе.Как сделать dword в массив байтов в 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. packetbuffer [0] будет 0xC
  2. packetbuffer [ 1] будет 0x00
  3. packagebuffer [2] будет 0x50
  4. packetbuffer [3] будет 0x00

и так далее

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

Я попытался это, но он не работает

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

ответ

2

Вы можете использовать BitConverter для преобразования данных в и из байтовых массивов. К сожалению, нет возможности скопировать в существующий массив. Мой собственный EndianBitConverter в моем MiscUtil library позволяет это, если вам это нужно, а также позволяет указать, что конечность использовать, конечно. (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 является излишним, но включены для ясности (с учетом предыдущей строки!).

EDIT: Еще одна альтернатива, если вы предпочитаете использовать стандартные библиотеки .NET, вы можете использовать BinaryWriter с MemoryStream.

+0

тарелочки @ Джон, спасибо! Не могли бы вы проверить свою библиотеку, если она позволяет вам выполнять эту работу). Также пример того, как это работает, будет высоко оценен. –

+0

@John: Я редактировал, пока вы комментировали :) –

0

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

Однако есть несколько подходов к вашей проблеме. Первым и очевидным является использование встроенной структуры сериализации. Не утруждайте себя написанием собственного кода сериализации, если вам не нужно. И в .NET вам не часто приходится.

Второй использовать BitConverter класс (метод GetBytes должен сделать трюк для преобразования в массив байт)

+0

Сильно напечатанный не означает, что вы не можете играть с битами и байтами в примитивном типе значений, как в интегральных. Самое сильное ограничение в системе набора текста CLR - это литье между ссылочными типами. –

+0

@Cecil: нет, нет никакого способа ** бросить ** между типами, которые запросит OP.Вы можете использовать любое количество классов и функций преобразования/сериализации для создания нового объекта на основе значения исходного объекта, конечно, но вы не можете взять объект одного типа и притворяться, что он имел еще один тип, который является конкретным подходом, о котором спрашивает ОП. – jalf

Смежные вопросы