Изменение порядка байтов в PHP - PullRequest
6 голосов
/ 25 сентября 2011

Итак, я делаю класс в PHP для анализа формата файла VPK .

Однако я столкнулся с проблемой:

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

Подпись должна быть 0x55aa1234, однако подпись, которую я читаю, - 0x3412aa55.

Как переключить порядок байтов в PHP?

Ответы [ 2 ]

4 голосов
/ 26 сентября 2011

Если ваши шестнадцатеричные значения всегда будут строками, вы можете использовать следующую функцию:

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

Согласен, это не самый эффективный, но код, на мой взгляд, довольно элегантный. Кроме того, он работает со всеми размерами чисел.

2 голосов
/ 25 сентября 2011

Вы должны конвертировать значение вручную.Алгоритм будет таким же, как и в C ++, поэтому просто перенесите этот код (вам нужен только тот, который работает на 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);
}

Источник: http://www.codeguru.com/forum/showthread.php?t=292902

...