Autor Zpráva
Darker
Profil
Mám soubor kódovaný v Little Endian a potřeboval bych čísla převést na Big Endian abych je mohl převést pomocí hexdec na desítková.
Našel jsem toto a následující kód:
function big_endian($int){
 return(($int&0xff)<<24)+(($int&0xff00)<<8)+(($int&0xff0000)>>8)+(($int>>24)&0xff);
}

Upraveno z C++ do PHP.
Jenže čísla co ze souboru vytáhnu jsou typu string, například "0900" je devět a já bych to potřeboval převést na šestnáctkový integer.
Jan Tvrdík
Profil
Nešlo by nějak použít unpack?
Darker
Profil
Jan Tvrdík:
A jak? Moc tomu nerozumím.

Zatím jsem to vyřešil prostě tak, že změním (prohodím) pořadí dvojic znaků v textové reprezentaci čísla. Ale radši bych to udělal matematickým řešením z [#1].
function big_endian($hex){
 return implode("",array_reverse(str_split($hex,2)));
}
Jan Tvrdík
Profil
Darker:
Zkus napsat příklad vstupu a očekávaného výstupu (včetně datových typů).
Darker
Profil
Vstup: string: 00F0 (LE)
Na int: int : 0x00f0 (=240)
výstup funkce : int: 0xf000 (=61tisíc)
Ale metoda přehození znaků naštěstí funguje (zatím)
Jan Tvrdík
Profil
function big_endian($int)
{
    return (($int >> 8) & 0x00FF) | (($int << 8) & 0xFF00); // pro 2 bytový int
}

$s = '00F0';          // string("00F0")
$n = hexdec($s);      // int(240)   = int(0x00F0)
$n = big_endian($n);  // int(61440) = int(0xF000)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0