2017-06-09 1 views
1

J'ai donc une adresse où se trouve un décalage pour un vftable. il est stocké dans l'ensemble sous forme d'octets. ex: 03 c3 bd 0cConvertir/convertir un tableau d'octets en adresse

Je veux obtenir les octets, et les convertir en style little endian à une adresse.

byte[0] = ((unsigned char *)addr)[3]; 
byte[1] = ((unsigned char *)addr)[2]; 
byte[2] = ((unsigned char *)addr)[1]; 
byte[3] = ((unsigned char *)addr)[0]; 

donc la sortie de l'exemple serait 0x0cbdc303.

Comment puis-je le coder correctement?

+0

J'étais sur le point de marquer ceci comme doublon, au moins pour le principe. Étonnamment, il y avait une réponse non-travail choisi [ici] (https://stackoverflow.com/q/20755897/1856738) bien qu'une [bonne réponse a été donnée] (https://stackoverflow.com/a/20756148/1856738), alors que [aucune réponse n'a été choisie ici] (https://stackoverflow.com/q/7879953/1856738). Maintenant, je vois deux gars se disputer ce que l'OP voulait vraiment ... ressemble à un sujet brûlant ... s'il vous plaît choisir la bonne réponse (maintenant que vous avez appris sur les opérations de changement) –

Répondre

0
byte[0] = ((unsigned char *)addr)[3]; 
byte[1] = ((unsigned char *)addr)[2]; 
byte[2] = ((unsigned char *)addr)[1]; 
byte[3] = ((unsigned char *)addr)[0]; 

devrait être suivi par

uint32_t address = (byte[0] << 24)|(byte[1] << 16)|(byte[2] << 8)|(byte[3]); 

Bien sûr, vous pouvez vous débarrasser de byte[] et le remplacer par les valeurs d'origine dans ce.

+0

... et sur une machine little-endian (ce qui doit être pour obtenir le bon numéro avec votre code), c'est une version lente de ma réponse (qui a été downvoted, probablement par vous) – deviantfan

+0

@deviantfan Il doit échanger des octets. Il le dit. Lisez la question – EJP

-1

Vous avez donc un périphérique little-endian et vous voulez convertir 4 octets little-endian en un seul nombre de 4 octets. Cela peut facilement se faire de cette façon:

uint32_t myNumber = *((uint32_t *)addr); 
+0

ne permute pas les octets selon le Le code OP. – EJP

+0

@EJP Imho OP n'a pas posé de questions sur l'échange, mais sur l'obtention d'une valeur numérique à partir des octets. OP juste deviné l'échange est nécessaire. – deviantfan

+0

Lire la question L'OP a 0x03c3bd0c et il veut 0x0cbd3c03. Difficile à voir pour accompagner cela sans échange. – EJP