[PHP] Grote unsigned long inlezen geeft overflow

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • GoneWacko
  • Registratie: September 2005
  • Laatst online: 10-09 16:57
Ik ben op het moment bezig met een scriptje wat binaire gegevens moet inlezen (MIX files uit de C&C spellen om precies te zijn).

De headers van deze bestandjes bevatten ID nummers, en dat zijn redelijk grote unsigned long's (little endian byte order).
Voor het inlezen van deze headers gebruik ik de unpack functie:
PHP:
1
2
3
4
5
6
for ($i=0; $i<$this->fileheader['filecount']; $i++)
    array_push(
        $this->fileheader['index'],
        unpack("Vid/Voffset/Vsize",
        fread($fh, 12))
    );


Maar zoals er op de manual pagina van unpack staat, slaat PHP zo'n unsigned long intern gewoon als een signed long op, waardoor mijn unsigned long er opeens als een negatief getal uit komt rollen :/
code:
1
2
3
4
5
6
7
8
9
10
11
*snip*
[0]=>
  array(3) {
    ["id"]=>
    int(-1978143457)
    ["offset"]=>
    int(3020246)
    ["size"]=>
    int(768)
  }
*snip*


Ik vraag mij nu af of er een workaround is voor dit probleem (behalve dan het kiezen van een andere taal :Y)), want ik heb er geen kunnen vinden. (Daarbij moet gezegd worden dat ik relatief onervaren ben met het jongleren met bits en bytes, maar daarom ben ik dan ook bezig met dit scriptje :))

Acties:
  • 0 Henk 'm!

  • cytherea
  • Registratie: Oktober 2003
  • Laatst online: 12-09 10:22
Ik ben dit zelf ook tegengekomen tijdens het schrijven van een extensie voor PHP. Mijn ervaring is dat alleen het echo'en en printen van de unsigned long een negatief getal geeft.
Verder ermee rekenen gaat helemaal goed, blijkbaar is ergens de conversie naar een string een beetje ranzig gedaan.
Het is bij mij nog nooit fout gegaan, op het printen na dan.

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Een ID heeft precies 1 taak, uniek zijn. Dan maakt de exacte waarde niet uit.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • cytherea
  • Registratie: Oktober 2003
  • Laatst online: 12-09 10:22
MSalters schreef op zondag 05 maart 2006 @ 22:21:
Een ID heeft precies 1 taak, uniek zijn. Dan maakt de exacte waarde niet uit.
Dat is ook een goede benadering :)

Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 18-09 16:24

mulder

ik spuug op het trottoir

MSalters schreef op zondag 05 maart 2006 @ 22:21:
Een ID heeft precies 1 taak, uniek zijn. Dan maakt de exacte waarde niet uit.
Maar dan is 10 niet gelijk aan -10 :)

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

  • GoneWacko
  • Registratie: September 2005
  • Laatst online: 10-09 16:57
Ik was achteraf inderdaad ook tot de conclusie gekomen dat ik wel met een negatief getal verder kon werken.
Maar ik vond het toch wel lelijk, en het werd nu ook moeilijker om te zien of mijn resultaten wel klopten omdat ik mijn voorbeelden (die een vriend me gegeven heeft) niet als negatief getal had :)

Maar ik heb nu besloten om het maar in Python te proberen, want die taal wou ik altijd al een keer leren :9

Dank voor de replies :Y)
Pagina: 1