a) È necessario preoccuparsi solo di "endianità" (cioè scambio di byte) se i dati sono stati creati su una macchina big-endian e vengono elaborati su una macchina little-endian o viceversa. Ci sono molti modi in cui ciò può accadere, ma qui ci sono un paio di esempi.
- Si ricevono dati su una macchina Windows tramite un socket. Windows utilizza un'architettura little-endian mentre i dati di rete sono "supposti" per essere in formato big-endian.
- Si elabora un file di dati che è stato creato su un sistema con un diverso "endianness".
In entrambi i casi, è necessario scambiare byte tutti i numeri superiori a 1 byte, ad es., corti, inte, long, double, ecc. Tuttavia, se si hanno sempre a che fare con dati della stessa piattaforma, i problemi di endian non sono di alcuna importanza.
b) In base alla tua domanda, sembra che tu abbia un puntatore char e desideri estrarre i primi 4 byte come un int e quindi affrontare eventuali problemi di endian. Per eseguire l'estrazione, utilizzare:
int n = *(reinterpret_cast<int *>(myArray)); // where myArray is your data
Ovviamente, questo presuppone che myArray non sia un puntatore nullo; in caso contrario, questo si bloccherà in quanto dereferenzia il puntatore, quindi impiegare un buon schema di programmazione difensiva.
Per scambiare i byte su Windows, è possibile utilizzare le funzioni ntohs()/ntohl() e/o htons()/htonl() definite in winsock2.h. Oppure si può scrivere alcune semplici routine per fare questo in C++, ad esempio:
inline unsigned short swap_16bit(unsigned short us)
{
return (unsigned short)(((us & 0xFF00) >> 8) |
((us & 0x00FF) << 8));
}
inline unsigned long swap_32bit(unsigned long ul)
{
return (unsigned long)(((ul & 0xFF000000) >> 24) |
((ul & 0x00FF0000) >> 8) |
((ul & 0x0000FF00) << 8) |
((ul & 0x000000FF) << 24));
}
fonte
2009-02-13 07:10:12
Sono un po 'confuso su quello che stai cercando di fare. Potresti scrivere qualche pseudocodice, ad esempio? Stai cercando di analizzare gli interi dall'array di caratteri? –
Sto cercando di trovare i byte sizeof (int) da un array char * e provare a confrontarlo con un numero intero. La fonte dei dati è una macchina diversa. – kal