Conversion d'un tableau d'octets (tableau char) en un type entier (short, int, long)
Je me demandais si le système de stockage des questions lors de la conversion d'un tableau d'octets pour un court /int /long. Serait-ce incorrect de faire si le code s'exécute sur big-endian et little-endian machines?
short s = (b[0] << 8) | (b[1]);
int i = (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | (b[3])
source d'informationauteur Mike
Vous devez vous connecter pour publier un commentaire.
Oui, endianness questions. En little endian vous avez l'octet le plus significatif dans la partie supérieure de court ou de type int - c'est à dire les bits 8 à 15, pour courte et 24-31 pour int. Pour big endian l'octet de commande devra être inversée:
On suppose que le tableau d'octets est en little endian commande. Stockage et de conversion entre le tableau d'octets et les types integer, ne dépend pas seulement sur le boutisme de la CPU, mais aussi sur le boutisme du tableau d'octets de données.
Il est recommandé d'envelopper ces conversions dans les fonctions qui sauront (soit via des indicateurs de compilation ou à l'exécution) le boutisme du système et d'effectuer la conversion correctement.
En outre, la création d'une norme pour le tableau d'octets de données (toujours en big endian, par exemple) et l'utilisation de la
socket
ntoh_s
etntoh_l
va décharger de la décision concernant le stockage de l'OSsocket
de mise en œuvre qui est au courant de ces choses. Notez que par défaut, réseau afin est big endian (len
dansntoh_x
), afin d'avoir le tableau d'octets de données comme big endian serait la plus simple façon de le faire.Comme l'a souligné par les OP (@Mike),
boost
fournit également boutisme des fonctions de conversion.//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
Non, c'est bien aussi loin que l'endianness, mais vous pouvez avoir des problèmes si votre
int
s sont seulement 16 bits de large.Le problème comme vous l'avez spécifié, où vous êtes à l'aide d'un existant tableau d'octets, fonctionnera très bien sur tous les ordinateurs. Vous allez vous retrouver avec la même réponse.
Toutefois, selon la façon dont vous êtes la création de ce cours d'eau, il peut être affecté par l'endianness et vous ne pouvez pas fin avec le numéro que vous le pensez.
Vous pouvez utiliser des syndicats pour cela. Endianness questions, de le changer, vous pouvez utiliser x86 BSWAP instruction (ou analogues pour l'autre des plates-formes), fourni par la plupart des compilateurs c intrinsèque.