Как преобразовать двойное слово в массив байтов в 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».
Вот как это размещено
- packagebuffer[0] будет 0xC
- packagebuffer[1] будет 0x00
- packagebuffer[2] будет 0x50
- packagebuffer[3] будет 0x00
и так далее
Как это сделать на С#?
Я попробовал это, но это не работает
packetBuffer[0] = 0xC;
packetBuffer[2] = (byte)0x5000; //error
packetBuffer[6] = (byte)dwArgs[13];
Решение
Вы можете использовать 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
.
Другие советы
Вы не можете.C# строго типизирован.Переменная имеет один и только один тип.Обман, подобный reinterpret_cast в C++, не допускается.
Однако есть несколько подходов к вашей проблеме.Первый и очевидный вариант — использовать встроенную платформу сериализации.Не утруждайте себя написанием собственного кода сериализации, если в этом нет необходимости.А в .NET это требуется нечасто.
Второй — использовать класс BitConverter (метод GetBytes должен помочь в преобразовании в массив байтов).