2011-09-25 14 views
6

Bu yüzden PHP'de VPK dosya biçimini ayrıştırmak için bir sınıf yapıyorum. bir derdim isabet ettik AncakPHP'de değişen endianness

:

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

imza Ancak okuyorum imza 0x3412aa55 olduğunu 0x55aa1234 olması gerekiyordu.

PHP'de endianlığı nasıl değiştirebilirim?

cevap

4

sizin onaltılık değerleri her zaman olacak olursa en verimli değil, ama kod Bence oldukça zarif,

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

Agreed: olmak dizeleri, aşağıdaki işlevini kullanabilirsiniz. Ayrıca, her sayıdaki sayılarla çalışır.

+0

Çok teşekkürler! Bu yaptı! Her bir metodu güneşin altında, altı haneli rakamları denemek ve yok etmek için denedim. Yönteminiz mükemmel çalışıyor. Teşekkürler! – robingchan

2

Değeri manuel olarak dönüştürmelisiniz. o, C++, bu kod yüzden sadece liman olduğu gibi algoritma aynı olacaktır (sadece afaik int çalışır birini gerekir):

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

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

+0

Bundan korktuğum: P Onu buraya getirmeyi denedim: http://pastebin.com/q8LtMy29 bu doğru mu? – robingchan

+0

Yasal görünüyor. Doğru çıktı veriyor mu? – klaustopher

+1

, PHP'nin işaretsiz tam sayıları desteklemediğini, bunun nasıl etkileyeceğini bilmediğini unutmayın. Ayrıca, hangi takas kullanacağınızı bilmek için PHP_INT_SIZE kullanarak int'nin boyutunu bulabilirsiniz (ushort one'ına ihtiyacınız olmaz) –