2011-09-25 11 views
6

Così sto facendo una classe in PHP per analizzare il formato di file VPK.Modifica endianness in PHP

Tuttavia ho colpito un problema:

object(VPKHeader)#2 (3) { 
    ["Signature"]=> 
    string(8) "3412aa55" 
    ["Version"]=> 
    string(4) "1000" 
    ["DirectoryLength"]=> 
    int(832512) 
} 

La firma si doveva essere 0x55aa1234, però la firma che sto leggendo è 0x3412aa55.

Come faccio a cambiare il endianness in PHP?

risposta

4

Se i valori esadecimali sarà sempre essere stringhe, è possibile utilizzare la seguente funzione:

function swapEndianness($hex) { 
    return implode('', array_reverse(str_split($hex, 2))); 
} 

d'accordo, non è il più efficiente, ma il codice è molto elegante a mio parere. Inoltre, funziona con tutte le dimensioni dei numeri.

+0

Grazie mille! L'ha fatto! Ho provato ogni metodo sotto il sole per provare a lanciare le cifre esadecimali, ma inutilmente. Il tuo metodo funziona perfettamente. Grazie! – robingchan

2

Devi convertire il valore manualmente. L'algoritmo sarà lo stesso come in C++, quindi basta porto questo codice (è sufficiente quello che funziona su int afaik):

inline void endian_swap(unsigned short& x) 
{ 
    x = (x>>8) | 
     (x<<8); 
} 

// this is the one you need 
inline void endian_swap(unsigned int& x) 
{ 
    x = (x>>24) | 
     ((x<<8) & 0x00FF0000) | 
     ((x>>8) & 0x0000FF00) | 
     (x<<24); 
} 

// __int64 for MSVC, "long long" for gcc 
inline void endian_swap(unsigned __int64& x) 
{ 
    x = (x>>56) | 
     ((x<<40) & 0x00FF000000000000) | 
     ((x<<24) & 0x0000FF0000000000) | 
     ((x<<8) & 0x000000FF00000000) | 
     ((x>>8) & 0x00000000FF000000) | 
     ((x>>24) & 0x0000000000FF0000) | 
     ((x>>40) & 0x000000000000FF00) | 
     (x<<56); 
} 

Fonte: http://www.codeguru.com/forum/showthread.php?t=292902

+0

Aveva paura di ciò: P Ho provato a portarlo qui: http://pastebin.com/q8LtMy29 è corretto? – robingchan

+0

Sembra legittimo. Dà l'uscita giusta? – klaustopher

+1

nota che PHP non supporta gli interi non firmati, non è sicuro di come ciò influenzerà le cose. Inoltre, puoi trovare la dimensione dell'int utilizzando PHP_INT_SIZE per sapere quale swap usare (non ti servirà lo stesso ushort) –