2011-09-25 11 views
6

Así que estoy haciendo una clase en PHP para analizar el formato de archivo VPK.Cambiar endianness en PHP

Sin embargo, me he pegado a un problema:

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

La firma se supone que es 0x55aa1234, sin embargo, la firma que estoy leyendo es 0x3412aa55.

¿Cómo cambio el endianness en PHP?

Respuesta

4

Si sus valores hexadecimales será siempre ser cadenas, se puede utilizar la siguiente función:

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

acordado, que no es el más eficiente, pero el código es bastante elegante en mi opinión. Además, funciona con todos los tamaños de números.

+0

¡Muchas gracias! Eso lo hizo! Probé todos los métodos bajo el sol para tratar de lanzar los dígitos hexadecimales, pero fue en vano. Tu método funciona a la perfección. ¡Gracias! – robingchan

2

Tiene que convertir el valor manualmente. El algoritmo será el mismo que se encuentra en C++, por lo que sólo el puerto este código (sólo es necesario el que funciona en int que yo sepa):

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); 
} 

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

+0

Tenía miedo de eso: P He tratado de portarlo aquí: http://pastebin.com/q8LtMy29 ¿es esto correcto? – robingchan

+0

Parece legítimo. ¿Le da la salida correcta? – klaustopher

+1

tenga en cuenta que PHP no admite enteros sin signo, no estoy seguro de cómo eso afectará las cosas. Además, puede encontrar el tamaño del int usando PHP_INT_SIZE para saber qué intercambio usar (aunque no necesitará el ushort) –