On m'a toujours enseigné que si un entier est supérieur à un char, vous devez résoudre le problème de commande octet. D'habitude, je vais simplement l'envelopper dans le Hton [L | S] et le convertir avec NTOH [L | S]. Mais je suis confus pourquoi cela ne s'applique pas aux personnages d'octets unique. P>
J'en ai marre de me demander pourquoi c'est et j'adorerais pour un programmeur de réseaux chevronnés pour m'aider à éclairer pourquoi les commandes d'octets s'appliquent uniquement aux entiers multi-octets. P>
ref: https://beej.us/guide/bgnet/html /multi/htonsman.html p>
7 Réponses :
Votre pile réseau gérera correctement les bits à l'intérieur des octets, vous ne devez vous préoccuper que d'obtenir les octets dans le bon ordre. P>
Vous ne lisez pas les bits individuels du fil, juste des octets. Indépendamment de l'endansion, un seul octet est le même à l'envers et en avant comme le mot "i" est le même verso et en avant. P>
De nombreux systèmes Ethernet codent des bits individuels - voir en.wikipedia.org/wiki/mlt-3 a>, bien que les plus rapides soient mordillons.
Combien de façons pouvez-vous commander les octets dans un seul caractère? p>
+1 pour Snark. Pour l'épeler: par définition en C et C ++ un caractère est la plus petite unité de stockage adressable.
-1 pour Snark. Vous connaissez la réponse à une question que l'OP n'a pas fait. Bien pour vous. Ne sois pas un imbécile à ce sujet.
Lighten Up - L'OP connaît évidemment sur les octets et Hton, etc. - pourquoi vous n'avez pas besoin de cela pour un octet n'est qu'un de ces moments d'oh.
@Martinbeckett: Même si je fais des calculs sur elle comme des bits et des ajouts (signé de caractère) i>? Ceci est destiné à convertir des points de code Unicode contenus dans des entiers à 8.
Ce que vous cherchez est Endianness . P>
Une architecture Big-Endian stocke les octets d'un type de données multibyte comme: p>
tandis qu'une architecture petite Endian les stocke à l'envers: p>
Lorsque les données sont transférées d'une machine à une autre, les octets d'un type de données unique doivent être réorganisés pour correspondre à l'endansion de la machine de destination. P>
Mais lorsqu'un type de données ne consiste en un octet, il n'y a rien à réorganiser em>. p>
+1, mais vous voudrez peut-être reconsidérer le vol de la bande passante d'un autre site.
@Bill, la politique de Wikipedia sur Hotlinking est à Commons.wikimedia.org/wiki/...< A> - mais wikimedia.org est bloqué ici, donc je ne peux donc pas la lire moi-même. Voulez-vous vous déranger la paraphrasant? Merci!
J'ai appris quelque chose de nouveau aujourd'hui, merci! Hotlinking Paraphrasé: "Allez-y, mais les images pourraient changer. Companier Scriptor." Bummer sur le blocage.
@Michaelmyers: mais quand un type de données ne comprend qu'un octet, il n'y a rien à réorganiser. Code> Même si je fais des calculs sur celui-ci comme Bitwise et ou des ajouts (signé de char) i> ? Ceci est destiné à convertir des points de code Unicode contenus dans des entiers à 8.
Vous devez considérer la fonction chaque fonction. De cela, vous devez appliquer cette connaissance à la taille du type que vous avez l'intention de modifier. Considérez les éléments suivants:
#include <stdio.h> #include <netinet/in.h> int main () { uint16_t i = 42; uint8_t c = 42; // a char printf ("(uint16_t ) %08X (%d)\n", i, i); printf ("( htons ) %08X (%d)\n", htons(i), htons(i)); printf ("( uint8_t ) %08X (%c)\n", c, c); printf ("( htons ) %08X (%c)\n", htons(c), htons(c)); return 0; } (uint16_t ) 0000002A (42) ( htons ) 00002A00 (10752) ( uint8_t ) 0000002A (*) ( htons ) 00002A00 ()
En plus de toutes les autres manières les a dit: L'endianness concerne l'ordre des octets dans un entier, pas sur l'ordre des bits dans un octet. L'ordre des bits dans un octet est identique même sur des machines de Big-Endian et de Little-Endian. La seule différence est l'ordre dans lequel les octets eux-mêmes sont utilisés pour stocker un entier (ou court-circuité ou quoi-à-delà). Et ainsi parce qu'il n'y a qu'un octet dans un caractère, il n'y a pas de différence dans la manière dont cette valeur est stockée, dans une architecture Big-Endian ou Little-Endian. P>
Même si je fais des calculs sur celui-ci comme Bit Bitwise et ou des ajouts (caractères signés) i>? Ceci est destiné à convertir des points de code Unicode contenus dans des entiers à 8.
Le code EZPZ est incorrect ..
uint16_t i = 65534; printf ("(uint16_t ) %08X (%u)\n", i, i); Returns... (uint16_t ) 0000FFFE (65534)
Appréciez les réponses, a eu un de ces moments "Doh"!