3 votes

Pourquoi nous ne nous soucions pas de l'ordre des bits ?

Récemment, j'ai appris un peu de programmation de socket Windows pour réaliser des connexions de socket.

Dans le code, nous utilisons certaines fonctions comme htonl(), htons() pour convertir nos données de l'ordre des octets de l'hôte à l'ordre des octets du réseau, ou ce que l'on appelle big-endian, puisque dans certaines machines, les données sont stockées en little-endian, comme le CPU d'Intel que je connais.

Mais ce que je ne comprends pas, c'est que la chose la plus importante n'est-elle pas l'ordre des bits au lieu des octets ?

Le bit étant l'unité minimale utilisée par les ordinateurs, et non l'octet. Disons que nous voulons transmettre un u_short u=18 à une autre machine par une machine utilisant little-endian.

Dans notre machine, le premier octet de u, le moins significatif est 2 et le second octet, le plus significatif est 1, laissez-moi l'exprimer par [2][1].

Nous devons donc d'abord appeler htons(u) pour convertir [2][1] en [1][2] et l'envoyer au réseau.

La machine distante recevra 2 en premier, mais 2 est exprimé par une séquence de bits que la machine reçoit effectivement sont 0000-0010, comment la machine sait-elle que cet octet est 2 ? Ne va-t-elle pas penser que 0000-0010 représente 64 ? (0100-0000) Toutes les machines stockent-elles les octets de la même manière ?

3voto

Xirema Points 677

L'"ordre des bits" est spécifié par les protocoles utilisés pour transférer les données du matériel (comme votre carte/port réseau) vers la mémoire de l'hôte.

Techniquement, cela s'applique dans beaucoup, beaucoup de cas. Par exemple, vous pourriez vous poser la même question si le disque dur d'une machine qui stocke les bits dans un ordre donné 01234567 est transféré à une machine qui stocke les bits dans l'ordre inverse. 76543210 si la lecture des données est correcte ou non.

Mais la réponse simple est que la lecture est toujours correcte, car les protocoles utilisés pour mapper les disques durs sur le bus système spécifient l'ordre exact des bits lorsqu'ils sont "présentés" à la mémoire hôte.

Les cartes réseau et le matériel de mise en réseau ont un comportement similaire : Ils ont un "ordonnancement des bits" normalisé qu'ils utilisent dans le matériel et, dans le cadre du protocole matériel, ils "présentent" ces bits à l'hôte sous la forme attendue par ce dernier.

L'"ordonnancement des octets", bien sûr, est une chose distincte, et plus difficile à gérer, car le matériel réseau et le matériel de stockage ne reconnaissent que des "flux d'octets" (oui, je simplifie à l'extrême), et ne se soucient guère de la signification réelle de ces octets.

Mais en termes de "commande de bits", à moins que vous n'écriviez du code "sur le métal", pour ainsi dire, vous n'avez pas besoin d'y penser.

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