7
votes

Conversion d'ordre d'octets de réseau avec "caractère"

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.

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.

ref: https://beej.us/guide/bgnet/html /multi/htonsman.html


1 commentaires

Appréciez les réponses, a eu un de ces moments "Doh"!


7 Réponses :


4
votes

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.


0 commentaires

2
votes

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.


1 commentaires

De nombreux systèmes Ethernet codent des bits individuels - voir en.wikipedia.org/wiki/mlt-3, bien que les plus rapides soient mordillons.



4
votes

Combien de façons pouvez-vous commander les octets dans un seul caractère?


4 commentaires

+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) ? Ceci est destiné à convertir des points de code Unicode contenus dans des entiers à 8.



25
votes

Ce que vous cherchez est Endianness .

Une architecture Big-Endian stocke les octets d'un type de données multibyte comme:

 Big-Endian

tandis qu'une architecture petite Endian les stocke à l'envers:

 Little-Endian

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.

Mais lorsqu'un type de données ne consiste en un octet, il n'y a rien à réorganiser .



3
votes

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 ()


0 commentaires

0
votes

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.


1 commentaires

Même si je fais des calculs sur celui-ci comme Bit Bitwise et ou des ajouts (caractères signés) ? Ceci est destiné à convertir des points de code Unicode contenus dans des entiers à 8.



0
votes

Le code EZPZ est incorrect ..

uint16_t i = 65534;
printf ("(uint16_t ) %08X (%u)\n", i, i);

Returns...
(uint16_t ) 0000FFFE (65534)


0 commentaires