Как преобразовать двойное слово в массив байтов в C#

StackOverflow https://stackoverflow.com/questions/693236

  •  22-08-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top