2017-05-12 2 views
-1

J'ai un pointeur de mémoire tampon et la fonction qui va être submergé par une adresse, ce quiComment encoder l'adresse d'octet de longueur impaire pour little endian?

static char buffer[12]; 
static int (*target_function)(char * str); 

Le trop-plein est lui-même pas le problème, mais je ne peux pas sembler mettre dans la bonne adresse qui est 0x8048338

Comme indiqué dans la question, le problème auquel je suis confronté maintenant, est comment puis-je coder cette adresse à little endian, ou toute l'endianness d'ailleurs?

+0

Erm ... quoi? Où est le débordement? De quelle adresse parlez-vous? qu'est-ce que ça a à voir avec les endiannes? –

+0

Avez-vous une fonction à l'adresse '0x8048338' et que vous voulez définir le pointeur de fonction? 'static int (* target_function) (char * str) = (int (*) (char * str)) 0x8048338;' devrait le faire, indépendamment de endianess. – mch

+2

'0x8048338' ==' 0x08048338' –

Répondre

2

0x8048338 en tant qu'entier de 32 bits dans l'ordre des octets BE est 08 04 83 38.

0x8048338 comme un entier de 32 bits dans l'ordre des octets LE est 38 83 04 08.


Hardcoded:

buf[0] = 0x38; 
buf[1] = 0x83; 
buf[2] = 0x04; 
buf[3] = 0x08; 

D'un var:

uint32_t n = 0x8048338; 

buf[0] = n && 0xFF; n >>= 8; 
buf[1] = n && 0xFF; n >>= 8; 
buf[2] = n && 0xFF; n >>= 8; 
buf[3] = n; 

Avec une boucle:

uint32_t n = 0x8048338; 
char* p = buf; 
for (int i=4; i--;) { 
    *(p++) = n && 0xFF; 
    n >>= 8; 
}