robingchan
robingchan

Reputation: 123

Changing endianness in PHP

So i'm making a class in PHP to parse the VPK file format.

However i've hit a problem:

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

The signature is supposed to be 0x55aa1234, however the signature I'm reading is 0x3412aa55.

How do I switch the endianness in PHP?

Upvotes: 6

Views: 3591

Answers (2)

Artefact2
Artefact2

Reputation: 7644

If your hex values will always be strings, you can use the following function :

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

Agreed, it's not the most efficient, but the code is quite elegant in my opinion. Also, it works with all sizes of numbers.

Upvotes: 6

David Titarenco
David Titarenco

Reputation: 33396

You have to convert the value manually. The algorithm will be the same as it is in C++, so just port this code (you only need the one that works on 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);
}

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

Upvotes: 2

Related Questions