Avatar billede cht22 Professor
02. februar 2017 - 11:27 Der er 5 kommentarer og
1 løsning

Omregning af tal fra HEX til decimal

Jeg har nogle tal jeg gerne vil regne om fra HEX til decimal med php.

F.eks. dette tal:

HEX: 80492deaa1ba04

Når jeg bruger funktionen hexdec får jeg ikke rigtige tal:

$result = number_format(hexdec("80492deaa1ba04"), 0, '.', '');

Så giver det:
036109258577787392

Når jeg bruger lommeregneren på computeren bliver det:
036109258577787396

Hvorfor får jeg denne fejl?
Avatar billede repox Seniormester
02. februar 2017 - 11:47 #1
Det skyldes funktionen number_format().

Eksempel


var_dump(hexdec("80492deaa1ba04")); // int(36109258577787396)


Modsat:


var_dump(number_format(hexdec("80492deaa1ba04"), 0, '.', '')); //string(17) "36109258577787392"



number_format() tager dit heltal (integers) fra hexdec() og konverterer tallet til en float, og floats er komplekse i forhold til heltal og smider noget af den arbitrære præcision (og så går der nogle tal tabt) og dermed får du et andet resultat.
Avatar billede cht22 Professor
02. februar 2017 - 12:01 #2
Hvordan får jeg så skrevet hele tallet, hvis jeg ikke bruger number_format så får jeg skrevet tallet på denne måde:

3.6109258577787E+16
Avatar billede repox Seniormester
02. februar 2017 - 12:47 #3
Det lader til at du måske kører PHP på en 32bit maskine?

Hvis jeg skriver:


<?php

echo hexdec("80492deaa1ba04");


Så udskrives det fulde heltal: 36109258577787396
På en 64bit maskine er det ikke noget problem, da det højeste tal muligt er 9223372036854775807 (som er noget større end dit heltal) hvorimod det højeste tal muligt på en 32bit maskine er 2147483647 som er meget lavere end dit heltal.

Du kan evenuelt prøve at lave et var_dump på PHP_INT_MAX for at se hvad det højeste tal du kan arbejde med er:


<?php

var_dump(PHP_INT_MAX);
Avatar billede cht22 Professor
02. februar 2017 - 13:09 #4
Tak det er en 64 bit maskine jeg kører på, men det er en 32 bit version af xampp jeg kører med, så det er der problemet er.

Så tror jeg bare jeg kører det på en anden server.
02. februar 2017 - 18:12 #5
HEJ,

Hvis det bare er få HEX-tal en gang i mellem er det lige så nemt at gå i TILBEHØR , finde KALKULATOR .

Skifte VISNING fra DECimal TIL HEXadecimal visning.  INdtaste dit tal (i HEX-notation) og skifte til DECIMAL -visning, og VIPS og VIOLA har du tallet som decimalt. 

(Har ikke prøvet decimaltal - endnu !)

Kristian
Avatar billede cht22 Professor
03. februar 2017 - 09:30 #6
#5 Ja det har du ret i. Det er dog tal jeg får fra en mobil app som står i omvendt rækkefølge så i stedet for at der står f.eks. a1:80 så står der 80:a1 og så er det smart med en side der både kan ændre rækkefølgen og omregne direkte uden at man skal udføre det i flere step. Det kan også være jeg får brug for at omregne i browseren på mobilen, så det er meget rart at php-siden virker nu.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester