2010-09-21 10 views
2

Je veux avoir une méthode avec le corps:Comment puis-je prendre deux octets et les combiner en un seul UInt16 en C#?

public UInt16 ReadMemory16(Byte[] memory, UInt16 address) 
{ 
    // read two bytes at the predefined address 
} 

, je veux donc obtenir la valeur à la mémoire [adresse] et l'octet suivant et les combiner en une seule UInt16.

Pour l'ordre des octets, la machine que j'implémente est peu endienne si cela compte. Comment puis-je obtenir ces deux valeurs octets et les combiner en un seul UInt16 en C#?

+0

Que voulez-vous dire par * la machine que je suis mise en œuvre est peu endian *? Voulez-vous dire que l'ordre des octets dans le tableau de la mémoire sera toujours petit boutiste? Ou la machine sur laquelle votre programme .NET sera exécuté est toujours peu endian? Ou les deux? –

+0

@ Mark Byers, j'imite une machine à jouet. Donc, la machine que j'implémente sera toujours petite boutiste. – Froglox

Répondre

7

Utilisez un bitshift:

return (ushort)((memory[address + 1] << 8) + memory[address]); 

Vous pouvez utiliser la classe BitConverter mais sachez qu'il ya un champ appelé statique readonly IsLittleEndian que vous devriez vérifier avant de l'utiliser. Si elle est déjà définie sur little endian, vous pouvez utiliser cette classe, mais si elle est définie sur une valeur incorrecte, vous ne pouvez pas la modifier. Vous pouvez également jeter un oeil à la bibliothèque MiscUtil de Jon Skeet, qui inclut la classe EndianBitConverter qui vous permet de spécifier l'endianness.

+1

@Mark Byers, Cela me rend confus car il semble que vous ayez quitté 8 positions AVANT de le lancer sur un appareil. Donc, un octet (puisque la mémoire est un tableau d'octets) est décalé de 8 positions restantes. Où vont ces bits lorsqu'ils sont décalés si ce n'est pas encore un ushort? – Froglox

+1

@Froglox: Bitshift (et la plupart des autres opérations) n'est défini que pour les entiers d'au moins 32 bits. Lorsque vous décalez un octet, il est d'abord implicitement converti en un int puis déplacé. Si vous préférez, vous pouvez écrire cette distribution explicitement. –

+1

@ Mark Byers, ah je vois maintenant. C'était la source de ma confusion. – Froglox

13

Une façon est d'utiliser la classe BitConverter:

public UInt16 ReadMemory16(Byte[] memory, UInt16 address) 
{ 
    return System.BitConverter.ToUInt16(memory, address); 
} 

Cela interprétera les octets selon le boutisme natif sur la machine.