Quelles sont les transformations utilisées par les systèmes little-endian pour convertir les données en ordre de réseau?

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

Question

Quelles sont les transformations sous-jacentes nécessaires pour convertir les données d’un système little-endian en ordre des octets du réseau? Pour les données à 2 octets et à 4 octets, il existe des fonctions bien connues (telles que htons, ntohl, etc.) pour encapsuler les modifications; que se passe-t-il pour les chaînes de données à 1 octet (le cas échéant)?

En outre, Wikipedia implique que little-endian est l’image miroir du big-endian, mais si cela était vrai, pourquoi aurions-nous besoin d’un traitement spécifique pour les données à 2 et 4 octets?

L’essai "Sur les guerres saintes et un plaidoyer pour la paix" semble impliquer qu'il existe de nombreuses variétés de little-endian - c'est un vieil essai - cela s'applique-t-il encore? Les marqueurs d'ordre des octets, comme ceux trouvés au début des fichiers de classe Java, sont-ils encore nécessaires?

Enfin, un alignement sur 4 octets est-il nécessaire pour l'ordre des octets sur le réseau?

Était-ce utile?

La solution

Supposons que vous avez le texte ASCII "BigE". dans un tableau b d'octets.

b[0] == 'B'
b[1] == 'i'
b[2] == 'g'
b[3] == 'E'

Il s'agit également de l'ordre du réseau pour la chaîne.

S'il était traité comme un entier 32 bits, ce serait

'B' + ('i' << 8) + ('g' << 16) + ('E' << 24) 

sur une petite plate-forme Endian et

'E' + ('g' << 8) + ('i' << 16) + ('B' << 24) 

sur une plate-forme big endian.

Si vous convertissez chaque travail 16 bits séparément, vous ne recevrez aucun de ces éléments

'i' + ('B' << 8) + ('E' << 16) + ('g' << 24) 

c'est pourquoi ntohl et ntohs sont tous deux obligatoires.

En d'autres termes, ntohs permute les octets en un court-mot de 16 bits et ntohl inverse l'ordre des quatre octets de son mot de 32 bits.

Autres conseils

Des fonctions de traitement spécifiques pour les données de 2 et 4 octets tirent parti du fait qu'il existe des instructions de processeur qui fonctionnent sur des tailles de données spécifiques. Exécuter une fonction d'inversion d'1 octet quatre fois est certainement moins efficace que d'utiliser des instructions plus larges pour effectuer les mêmes opérations (même si leur échelle augmente) sur les quatre octets à la fois.

Les données sur 1 octet ne nécessitent aucune conversion entre endians (c’est un avantage de UTF-8 par rapport à UTF-16 et UTF-32 pour l’encodage de chaînes).

  

Un alignement sur 4 octets est-il nécessaire pour l'ordre des octets sur le réseau?

Aucun alignement spécifique n'est nécessaire pour les octets passant sur un réseau. Votre processeur peut exiger un certain alignement en mémoire, mais c'est à vous de résoudre le problème. La famille x86 ne fait généralement pas de telles demandes.

L’idée de base est que tous les types multi-octets doivent avoir l’ordre de leurs octets inversés. Un entier de quatre octets aurait les octets 0 et 3 remplacés et les octets 1 et 2 remplacés. Un entier de deux octets aurait les octets 0 et 1 remplacés. Un caractère d'un octet n'est pas échangé.

Il y a deux implications très importantes dans ce phénomène que les novices et les novices ne réalisent pas toujours:

  1. (ASCII) Les chaînes de caractères ne sont pas touchées.
  2. Il n'y a pas d'algorithme aveugle pour échanger des octets "données" génériques. Vous devez connaître le type de toutes vos données et permuter chaque élément de la manière requise pour son type.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top