Toon posts:

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

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 13:53
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 Airplane Manager en Repeat


Acties:
  • 0Henk 'm!

  • Rmg
  • Registratie: November 2003
  • Laatst online: 13:45
welke versie van php draai je?

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

Acties:
  • 0Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 08-06 20:53
Je zou denken dat een bug uit 2006 wel eens gefixt is, toch?

Acties:
  • 0Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 08-06 15:30

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.


Acties:
  • 0Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 09:54

Jaap-Jan

Geen IPv6- ready check meer :(

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


Acties:
  • 0Henk 'm!

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

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

{signature}


Acties:
  • 0Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 13:53
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 Airplane Manager en Repeat

Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee