Reputation: 123
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
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
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