La conversion d'un UINT32 valeur dans un array UINT8[4]
Ma question est comment faire pour convertir un UINT32 valeur d'un array UINT8[4] (C/C++), de préférence, de manière indépendante de l'endianness? En outre, comment voulez-vous reconstruire l'UINT32 valeur de l'array UINT8[4], pour revenir là où vous avez commencé?
Comment voulez-vous faire la conversion? Big-endian ou little-endian? Plus précisément: Si votre entrée est 0x12345678, voulez-vous de tableau[0] pour être 0x12 ou 0x78? Vous devez décider par vous-même. Alors nous pouvons vous aider.
Qu'est-ce que "C/C++"?
C'est le summum de l'el-dorado
Qu'est-ce que "C/C++"?
C'est le summum de l'el-dorado
OriginalL'auteur Chris | 2011-06-27
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas vraiment dit ce que tu veux dire par indépendant de l'endianness - on ne sait pas depuis le tableau d'octets doit avoir certains boutisme. Cela dit, un ci-dessous qui doit répondre à vos exigences:
Donné
UINT32 v
etUINT8 a[4]
:"Hôte" endian
(utilisation de la machine natif de l'ordre des octets):
ou:
ou:
Big endian
(aka "réseau commande"):
Little endian
qui n'a pas de sens. Des valeurs primitives ne peut pas obtenir "déplacé", comme ça.
Si vous avez toujours besoin de copier...
Oui. Si vous parlez de C++11 "sémantique de déplacement" il n'y a rien à "déplacer" dans une variable de 32 bits.
OriginalL'auteur Alnitak
E. g. comme ceci:
Edit: ajouté entre parenthèses (>> semble avoir une priorité plus élevée que &)
>> 0
pour exactement cet effet), et il devrait être assez terrible compilateur qui ne serait pas d'en optimiser loin.Quelle que soit la valeur esthétique de la
&
opérateurs, le fait est qu'ils tuent le code.>>
a une priorité plus élevée que&
.En fait, je retire ce que. J'ai négligé le fait que nous convertir à
uint8
, alors bien sûr, tous les masques sont inutiles, comme @Stephen points.Et au sujet de l'utilisation de &: Vous n'avez pas seulement l'écriture de code pour le compilateur. Vous aussi écrivez du code pour l'une lecture du code après vous. À mon avis, en ajoutant & il est clair que vous prenez ce octets, et vous ne comptez pas sur tout derrière votre dos de la troncature. Je continue de penser que le compilateur est plus intelligent que celui de la lecture du code. Afin de ne pas rendre le code lisible pour le compilateur; le rendre lisible pour le lecteur.
Vous devriez noter que c'est little-endian.
OriginalL'auteur Patrick
Si vous ne voulez pas de code vous-même, vous pouvez utiliser la fonction de la bibliothèque C htonl() pour convertir les 32 bits de type int à l'ordre des octets de réseau. Il y a aussi la fonction ntohl() pour les convertir en retour à l'accueil de l'ordre.
Une fois qu'ils sont dans l'ordre des octets de réseau, c'est simplement une question de l'accès à l'int/long comme un tableau d'octets.
Dans l'ensemble qui est probablement le plus portable et testés façon d'atteindre votre objectif.
OriginalL'auteur Timo Geusch
On pourrait aussi le faire avec des pointeurs. (C'est en little endian, mais si vous utilisez la même méthode de reconstruction n'a pas d'importance)
Cela affecte la valeur de la uint32 pour les 4 octets après l'adresse mémoire de la uint8, faire exactement ce que vous nécessité.
Aller dans l'autre sens:
OriginalL'auteur amrelk
utiliser une Union composée d'une Matrice à 4 temps uint8
et un uint32.
Donc il trie automatiquement par c inhérente pointeur de la Magie (les Tableaux sont des pointeurs de début de tableau)
OriginalL'auteur luja