PHP large integer naar hexadecimal converteren. Hoe ?

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • smokeandnoise
  • Registratie: Januari 2003
  • Laatst online: 10-04-2024
Hi,

Ik ben bezig met een script waarbij ik een integer van max ca 30 decimalen naar hexadecimal wil omzetten.

Als ik de functie dechex gebruik dan mis ik al snel een paar hexadecimals als ik over de 20 decimalen heen ga.

Dit heeft op een of andere manier met arbitrary precision te maken.

Ik heb bcmath op mijn server geinstalleerd, maar alle functies die ik op het web tegen kom die gebruik maken van deze library geven mij het zelfde probleem.

Hoe los ik dit op?

Alvast dank!

Alle reacties


Acties:
  • 0 Henk 'm!

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 28-09 18:33
google op ‘bigint to hex php’

Acties:
  • 0 Henk 'm!

  • Wiebeltje
  • Registratie: Maart 2013
  • Laatst online: 09:22
Voor zover ik weet heeft PHP geen bigints? Heb je een database? Doe je gewoon een SELECT met MySQL. Die kan daar wel mee om gaan. Is misschien niet heel mooi maar het werkt.

Edit: MySQL bigint is ook niet groot zat maar als hij het als een decimal ziet zou het moeten lukken.

Beter zoeken:
https://stackoverflow.com...er-to-hex-in-php#14540041

[ Voor 40% gewijzigd door Wiebeltje op 11-12-2019 23:35 ]


  • smokeandnoise
  • Registratie: Januari 2003
  • Laatst online: 10-04-2024
Bolukan schreef op woensdag 11 december 2019 @ 23:01:
google op ‘bigint to hex php’
Zoals ik zei, de voorbeelden die ik vind, werken niet. Dus er gaat iets mis.

bcmath is ingeinstalleerd en ik draai php 7.1

Ik krijg of afgekapte resultaten (als ik becdex gebruik)
of hele vreemde resultaten als ik door andere geprogrammeerde functies gebruik waarbij als ik het resultaat terug reken naar decimal ik met een ander getal zit als waarmee ik begonnen ben.

  • smokeandnoise
  • Registratie: Januari 2003
  • Laatst online: 10-04-2024
Wiebeltje schreef op woensdag 11 december 2019 @ 23:22:
Voor zover ik weet heeft PHP geen bigints? Heb je een database? Doe je gewoon een SELECT met MySQL. Die kan daar wel mee om gaan. Is misschien niet heel mooi maar het werkt.

Edit: MySQL bigint is ook niet groot zat maar als hij het als een decimal ziet zou het moeten lukken.

Beter zoeken:
https://stackoverflow.com...er-to-hex-in-php#14540041
Die functie waar je naar linkt heb ik meerdere keren geprobeerd, maar de uitkomst is 0 als ik een decimal door deze functie heen haal ongeacht de input.

bcmath library die hiervoor benodigd is heb ik geinstalleerd.

[ Voor 14% gewijzigd door smokeandnoise op 12-12-2019 08:29 ]


Acties:
  • +1 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 04-10 21:56
smokeandnoise schreef op donderdag 12 december 2019 @ 08:24:
[...]

Die functie waar je naar linkt heb ik meerdere keren geprobeerd, maar de uitkomst is 0 als ik een decimal door deze functie heen haal ongeacht de input.

bcmath library die hiervoor benodigd is heb ik geinstalleerd.
Dit is het antwoord dat eronder staat:
idk why but this gives me output 0 . what should i do, i have bcmath and gmp installed, latest php 7 – AMB Aug 22 '17 at 4:20
--> make sure to use input to function as a string and not as int i.e. put your big int in quotes
Een decimal is trouwens weer heel wat anders dan een int. Gaat het nou om een int met 30 karakters of een decimal met 30 karakters achter de komma?

  • smokeandnoise
  • Registratie: Januari 2003
  • Laatst online: 10-04-2024
je hebt gelijk, probeer een INT naar Hexadecimal om te zetten.
Geen tekens achter de komma.

  • smokeandnoise
  • Registratie: Januari 2003
  • Laatst online: 10-04-2024
Als ik dechex gebruik gaat dit goed tot 20 tekens, daarboven wordt de output afgekapt (mis ik hexadecimals)
Als ik bcdechex gebruik gaat dit ook goed tot 20 tekens, daarboven wordt is de output 0.

Acties:
  • +1 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Had je al naar GMP gekeken?

php > $num = '9312660682897061594767289296453011313180604726492752614962349778735928598708212386406555876878916185094145420038141655929349984786756296776268556142401047';
php > echo gmp_strval(gmp_init($num), 16);
b1cf5653e79bef001acfb0f99d1f34487d16a8253e3a9971e98d46382114e8ac81b5102ab3c56be1f77d0eb754f566c0dacb23d64755e823f35411f9e14c5617

// Of simpeler:
php > echo gmp_strval($num, 16);
b1cf5653e79bef001acfb0f99d1f34487d16a8253e3a9971e98d46382114e8ac81b5102ab3c56be1f77d0eb754f566c0dacb23d64755e823f35411f9e14c5617

[ Voor 18% gewijzigd door ACM op 12-12-2019 09:09 ]


  • smokeandnoise
  • Registratie: Januari 2003
  • Laatst online: 10-04-2024
Merethil schreef op donderdag 12 december 2019 @ 08:45:


Dit is het antwoord dat eronder staat:

[...]
Had ik ook geprobeerd, maar maakt niets uit. Ieder nummer vanaf 20 cijfers wordt afgekapt of geeft 0. Of ik nu het getal naar string om zet of niet.

Word er een beetje moedeloos van inmiddels. lol

  • smokeandnoise
  • Registratie: Januari 2003
  • Laatst online: 10-04-2024
ACM schreef op donderdag 12 december 2019 @ 09:09:
Had je al naar GMP gekeken?

php > $num = '9312660682897061594767289296453011313180604726492752614962349778735928598708212386406555876878916185094145420038141655929349984786756296776268556142401047';
php > echo gmp_strval(gmp_init($num), 16);
b1cf5653e79bef001acfb0f99d1f34487d16a8253e3a9971e98d46382114e8ac81b5102ab3c56be1f77d0eb754f566c0dacb23d64755e823f35411f9e14c5617

// Of simpeler:
php > echo gmp_strval($num, 16);
b1cf5653e79bef001acfb0f99d1f34487d16a8253e3a9971e98d46382114e8ac81b5102ab3c56be1f77d0eb754f566c0dacb23d64755e823f35411f9e14c5617
GMP moet ik nog proberen, ik had gehoopt dat het met de bcmath extension zou kunnen. Thanks!

Acties:
  • +1 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

smokeandnoise schreef op donderdag 12 december 2019 @ 09:14:
GMP moet ik nog proberen, ik had gehoopt dat het met de bcmath extension zou kunnen. Thanks!
Het kan op allerlei manieren :P

Maar ik denk dat deze gmp-optie wel veruit de simpelste voor zover ik kan zien. Maar als je geen GMP wilt installeren, dan moet je wel meer zelf doen.

Maar ook die bcmath-methode werkt bij mij gewoon:
php > function bcdechex($dec) {
php {     $hex = '';
php {     do {
php {         $last = bcmod($dec, 16);
php {         $hex = dechex($last).$hex;
php {         $dec = bcdiv(bcsub($dec, $last), 16);
php {     } while($dec>0);
php {     return $hex;
php { }
php > $num = '9312660682897061594767289296453011313180604726492752614962349778735928598708212386406555876878916185094145420038141655929349984786756296776268556142401047';
php > echo bcdechex($num);
b1cf5653e79bef001acfb0f99d1f34487d16a8253e3a9971e98d46382114e8ac81b5102ab3c56be1f77d0eb754f566c0dacb23d64755e823f35411f9e14c5617

  • smokeandnoise
  • Registratie: Januari 2003
  • Laatst online: 10-04-2024
Aha!

Als ik het getal invoer uit het voorbeeld, dan gaat het hier ook goed.

Dan gaat er hier iets anders mis.. wat ik doe is dit

$amount = $amount * 1000000000000000000;
echo bcdechex("$amount");

Dat gaat alleen goed als $amount = 1 bij aanvang.
Zodra $amount = 10 bij aanvang, dan maakt php van de uitkomst dit : 1.0E+19

D'r gaat dus iets mis bij het vermenigvuldigen van mijn getal en niet bij het omzetten naar hex.

  • MrMonkE
  • Registratie: December 2009
  • Laatst online: 26-08 00:10

MrMonkE

★ EXTRA ★

overflow?

★ What does that mean? ★


  • smokeandnoise
  • Registratie: Januari 2003
  • Laatst online: 10-04-2024
Dat was 'm volgens mij, ik moet dit doen ipv ordinary *

$amount = bcmul ( $amount, 1000000000000000000);

  • smokeandnoise
  • Registratie: Januari 2003
  • Laatst online: 10-04-2024
Yes..!

't is opgelost, 't ging dus mis bij het opbouwen van de input ik naar bcdechex stuurde, de vermenigvuldiging van het getal wat als input diende moest ook met de bcmath library uitgerekend worden ipv met de standaard * operator van php.

Allen dank voor het meedenken, ik kan weer verder. :-)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
smokeandnoise schreef op donderdag 12 december 2019 @ 09:31:
Dan gaat er hier iets anders mis.. wat ik doe is dit

$amount = $amount * 1000000000000000000;
echo bcdechex("$amount");
8)7 Je hebt BCMath gebruikt om met grote getallen te kunnen werken en vervolgens verwacht je dat PHP op magische wijze snapt dat zo'n vermenigvuldiging wel werkt?

Maar goed; met fatsoenlijk debuggen had je dit natuurlijk ook prima zélf kunnen vinden. Stap met een debugger door je code of controleer tussentijds of de variabelen bevatten wat je verwacht wat ze bevatten. Debuggen: Hoe doe ik dat? Dat had een hoop gescheeld :>

En dan weet je voor een volgende keer ook: maak een testcase met daarin enkel code om je probleem te reproduceren; had je die gemaakt en code gestript tot het uiterste dan was je er ook tegenaan gelopen, en, in het uitzonderlijke geval van niet dan had je in ieder geval hier een handvol regels code kunnen plaatsen die we met z'n allen hadden kunnen bekijken i.p.v. in onze kristallen bol moeten kijken.

[ Voor 21% gewijzigd door RobIII op 12-12-2019 10:01 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • smokeandnoise
  • Registratie: Januari 2003
  • Laatst online: 10-04-2024
Euh..

Tjsa.. ik was al 6 uur aan het pielen om het probleem opgelost te krijgen en heb allerlei benaderingen van het probleem uitgeprobeerd. Kan gebeuren toch dat ik iets over het hoofd zie? Vandaar dat ik het hier vraag.. :-)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik zeg 't dan ook niet om na te trappen maar om je aan 't verstand te peuteren dat je soms een stapje terug moet doen en methodisch te werk gaan ;) Als je 6 uur moet pielen op zo'n probleem doe je iets verkeerd; en dat is niet lullig bedoeld, gewoon een conclusie die ik trek. En dus mijn tip: je debug-proces eens herzien.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • smokeandnoise
  • Registratie: Januari 2003
  • Laatst online: 10-04-2024
Ik ga zeker die manual eens doorlezen.

Het ding is gewoon, dat als ik tegen een bug aanloop ik van alles ga testen, en vaak test ik wel de inhoud van de variabele waar iets mee moet gebeuren, maar deze keer ben ik dat vergeten, simpelweg omdat ik er van uitging dat alleen de conversie van int naar hex een probleem was met een grote integer maar niet dat het vermenigvuldigen dat ook zou zijn.

Hoe dan ook, iedereen dank, zonder dit topic had ik er waarschijnlijk nog langer over gedaan om de fout te vinden. :-)

  • PageFault
  • Registratie: April 2002
  • Laatst online: 03-10 13:28
Je had toch ook het getal in 2 stukken kunnen opsplitsen en beide na hex omzetting achter elkaar zetten?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
PageFault schreef op donderdag 12 december 2019 @ 22:59:
Je had toch ook het getal in 2 stukken kunnen opsplitsen en beide na hex omzetting achter elkaar zetten?
8)7 Ja want zo werkt hexadecimaal 8)7

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 12:51

MueR

Admin Tweakers Discord

is niet lief

PageFault schreef op donderdag 12 december 2019 @ 22:59:
Je had toch ook het getal in 2 stukken kunnen opsplitsen en beide na hex omzetting achter elkaar zetten?
Afbeeldingslocatie: https://media.giphy.com/media/pPhyAv5t9V8djyRFJH/giphy.gif

Met RobIII hierboven.... echt...

[ Voor 5% gewijzigd door MueR op 13-12-2019 00:23 ]

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • PageFault
  • Registratie: April 2002
  • Laatst online: 03-10 13:28
RobIII schreef op vrijdag 13 december 2019 @ 00:22:
[...]

8)7 Ja want zo werkt hexadecimaal 8)7
Ja, het msb delen door je deler en omzetten (gebroken deel negeren) en dan de modules van het lsb. Niks moeilijks aan....

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
PageFault schreef op vrijdag 13 december 2019 @ 00:57:
[...]


Ja, het msb delen door je deler en omzetten (gebroken deel negeren) en dan de modules van het lsb. Niks moeilijks aan....
Ik zie je implementatie die met arbitrary length integers overweg kan én die aan "het getal in 2 stukken [...] opsplitsen en beide na hex omzetting achter elkaar zetten" én die simpeler is dan TS nu heeft (bcdechex) graag tegemoet! Ik reageerde namelijk op je uitspraak hier...

[ Voor 18% gewijzigd door RobIII op 13-12-2019 01:19 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-10 16:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

PageFault schreef op donderdag 12 december 2019 @ 22:59:
Je had toch ook het getal in 2 stukken kunnen opsplitsen en beide na hex omzetting achter elkaar zetten?
Hoe wordt het probleem makkelijker als je in stapjes van 32 bits ipv 4 bits gaat werken dan? Bovendien is het inmiddels al duidelijk dat het probleem elders lag (een gewone mul ipv een bcmul).

[ Voor 13% gewijzigd door .oisyn op 13-12-2019 01:32 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1