[PHP] Unpack van hexadecimale waarden gaat niet altijd goed.

Pagina: 1
Acties:

Onderwerpen


  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 18:24
Ik heb mijn stuk code vereenvoudigd tot het volgende:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$Value          = 611;
$Base16Number   = base_convert($Value, 10, 16);
$HexValue       = pack("H*", $Base16Number);

echo "#".$Value."#".$Base16Number."#".$HexValue."#<br>";
// Resultaat: #611#263#&0#

$UBase16Number  = unpack("H*", $HexValue);
$ResultValue    = base_convert($UBase16Number[1], 16, 10);

echo "#".$UBase16Number[1]."#".$ResultValue."#<br>";
// Resultaat: #2630#9776#

De * bij pack() geeft aan dat er automatisch gedetecteerd wordt hoeveel karakters er nodig zijn om het getal te coderen, en dit gaat goed. In dit geval zijn er 3 karakters nodig.
Maar bij unpack() werkt * niet goed. Hij zou moeten bepalen dat er 3 karakters zijn, maar maakt er toch 4 van.
Als ik * vervang door het getal 3, dan gaat het wel goed.

Het probleem lijkt te zitten als het resultaat van pack() een oneven aantal karakters terug geeft.
Op PHP.net en andere sites wordt hier verder niet op ingegaan, en blijft het bij de uitleg van de functie zelf.

Hoe krijg ik het nu voor elkaar dat unpack() met het juiste aantal tekens weer decodeert?

Speel ook Balls Connect en Repeat


  • Rmg
  • Registratie: November 2003
  • Laatst online: 22:21

Rmg

welke versie van php draai je?

want: http://bugs.php.net/36148

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04-11 16:50
Je zou denken dat een bug uit 2006 wel eens gefixt is, toch?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Soultaker schreef op zondag 22 mei 2011 @ 01:31:
Je zou denken dat een bug uit 2006 wel eens gefixt is, toch?
Ik heb wel gekkere dingen gezien. :P

Ontopic: als je weet dat je er altijd 3 nodig hebt, waarom vul je dan niet gewoon die 3 in in plaats van een *? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 18:58
Ik denk dat 't 'm inderdaad zit in het feit dat de HEX- string 3 karakters is. Dat is 1,5 byte, maar de padding wordt verkeerd gedaan als de lengte van de string niet bekend is.

Workaround is zelf padden indien nodig (voordat de string ge'pack()t wordt):

PHP:
1
2
3
if ((strlen($Base16Number) % 2) != 0) {
        $Base16Number = '0'.$Base16Number;
}


Maar de oplossing lijkt mij een bug report.

NMe: Hij zegt niet dat 'ie altijd 3 karakters nodig heeft, alleen in dit geval. ;)

[ Voor 13% gewijzigd door Jaap-Jan op 22-05-2011 02:06 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
edit:
... bullshit

[ Voor 81% gewijzigd door Voutloos op 22-05-2011 10:28 ]

{signature}


  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 18:24
De versie van PHP is 5.3.4, dus redelijk recent. :)
Jaap-Jan schreef op zondag 22 mei 2011 @ 02:04:
PHP:
1
2
3
if ((strlen($Base16Number) % 2) != 0) {
        $Base16Number = '0'.$Base16Number;
}
Dit lijkt mij ook een goede workaround daarvoor, en zal ik dan ook toepassen. Als die bug ooit eens weer terug komt, heb ik daar geen last van. :+
Ik zal straks een bugreport doen.

Speel ook Balls Connect en Repeat

Pagina: 1