Como transmitir um DWORD em uma matriz de bytes em C #
Pergunta
Como você já deve saber, eu estou migrando para C # e algumas coisas em C ++ diferente olhar.
código 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 nota e keyArray2 são "matriz de DWORD"
Esta é a forma como ele é colocado
- packetbuffer [0] será 0xC
- packetbuffer [1] será 0x00
- packetbuffer [2] será 0x50
- packetbuffer [3] será 0x00
e assim por diante
Como fazer isso em C #?
Eu tentei isso, mas ele não funciona
packetBuffer[0] = 0xC;
packetBuffer[2] = (byte)0x5000; //error
packetBuffer[6] = (byte)dwArgs[13];
Solução
Você pode usar BitConverter
para converter dados para e a partir de matrizes de bytes. Infelizmente não há nenhuma facilidade para copiar em uma matriz existente. Minha própria EndianBitConverter
na minha MiscUtil biblioteca permite que este se você precisar dele, bem como permitindo que você para especificar a ordenação de usar, é claro. (BitConverter
é geralmente pouco endian em .NET -. Você pode verificá-lo com o campo IsLittleEndian
)
Por exemplo:
EndianBitConverter converter = EndianBitConverter.Little;
converter.CopyBytes((short) 0xc, packetBuffer, 0);
converter.CopyBytes((int) 0x5000, packetBuffer, 2);
converter.CopyBytes(dwArgs[13], packetBuffer, 6);
etc. O elenco para int
na segunda chamada para CopyBytes
é redundante, mas incluído para maior clareza (tendo em mente a linha anterior!).
EDIT: Outra alternativa se você preferir ficar com o .NET bibliotecas padrão, você pode querer usar BinaryWriter
com um MemoryStream
.
Outras dicas
Você não pode. C # é fortemente tipado. Uma variável tem um, e apenas um tipo. Artifícios como o C ++ reinterpret_cast não é permitido.
Existem várias abordagens para o problema embora. A primeira e óbvia, é usar a estrutura de serialização embutida. Não se preocupe em escrever o seu próprio código de serialização a menos que você precisa. E em .NET, você não têm muitas vezes a.
O segundo é a utilização da classe BitConverter (o método GetBytes deve fazer o truque para converter a matriz de bytes)