64 votes

C # petit endian ou big endian?

Dans la documentation du matériel qui nous permet de le piloter via UDP/IP, J'ai trouvé le fragment suivant:

Dans ce protocole de communication, DWORD est un 4 octets de données, MOT 2 octets de données, OCTET un octet de données. Le format de stockage est en little endian, soit 4 octets (32 bits), les données sont stockées en tant que: d7-d0, d15-d8, d23-d16, d31-d24; deux octets (16 bits), les données sont stockées en tant que: d7-d0 , d15-d8.

Je me demande comment cela se traduit en C#? Dois-je convertir des trucs avant de l'envoyer? Par exemple, si je veux envoyer plus d'un entier de 32 bits, ou un 4 chaîne de caractères?

83voto

Jon Skeet Points 692016

C# elle-même ne définit pas l'endianness. Chaque fois que vous convertissez des octets, cependant, vous aurez un choix à faire. Le BitConverter classe a un IsLittleEndian domaine pour vous dire comment il va se comporter, mais il ne donne pas le choix. Il en va de même pour BinaryReader/BinaryWriter.

Mon MiscUtil bibliothèque dispose d'une EndianBitConverter classe qui vous permet de définir le boutisme; il existe des équivalents pour BinaryReader/Écrivain. Pas de en ligne guide d'utilisation, j'ai peur, mais ils sont triviales :)

(EndianBitConverter dispose également d'une fonctionnalité qui n'est pas présent dans la normale BitConverter, qui est de faire des conversions en place dans un tableau d'octets).

47voto

Jan Bannister Points 1879

Vous pouvez aussi utiliser

 IPAddress.NetworkToHostOrder(...)
 

Pour court, int ou long.

10voto

Marc Gravell Points 482669

Re little-endian, la réponse courte (pour ce faire j'ai besoin de faire quoi que ce soit) est "probablement pas, mais cela dépend de votre matériel". Vous pouvez vérifier auprès de:

bool le = BitConverter.IsLittleEndian;

En fonction de ce que cela dit, vous pouvez inverser les portions de vos tampons. Sinon, Jon Skeet a-endian convertisseurs ici (cherchez EndianBitConverter).

Notez que les itaniums (par exemple) sont big-endian. La plupart des Intels sont little-endian.

Re spécifiques UDP/IP,...?

3voto

gbjbaanb Points 31045

Vous avez besoin de savoir sur ordre des octets de réseau ainsi que endian CPU-ness.

Généralement pour TCP/UDP comms, vous pouvez toujours convertir les données en ordre des octets de réseau à l'aide de l' htons de la fonction (et ntohs, et de leurs fonctions).

Normalement réseau de l'ordre big-endian, mais dans ce cas (pour une raison!) les comms est en little endian, de sorte que ces fonctions ne sont pas très utiles. Ceci est important car vous ne pouvez pas assumer l'UDP comms ils ont mis en œuvre suivez toutes les autres normes, il rend la vie difficile si vous avez un big-endian architecture que vous juste ne peut pas envelopper le tout avec de l' htons que vous devez :-(

Toutefois, si vous êtes en provenance d'un processeur intel x86 l'architecture, alors vous êtes déjà en little-endian, donc il suffit d'envoyer les données sans faire de conversion.

1voto

Widi Points 132

Ou vous pouvez utiliser ce code pour passer du BitConverter au big endian:

 typeof (BitConverter).GetRuntimeField("IsLittleEndian").SetValue(null, false);
 

Et pour revenir à little endian:

 typeof (BitConverter).GetRuntimeField("IsLittleEndian").SetValue(null, true);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X