Große Hex-Werte mit PHP hexdec

8

Ich habe einige große HEX-Werte, die ich als reguläre Zahlen anzeigen möchte, ich habe hexdec () verwendet, um in float zu konvertieren, und ich habe eine Funktion auf PHP.net gefunden, um diese in Dezimalzahlen umzuwandeln, scheint aber a zu treffen Decke, zB:

%Vor%

Ausgabe: 1.5406319846274E + 19 = 15406319846274000000

Ergebnis von calc.exe = 15406319846273791563

Gibt es eine andere Methode, um große Hex-Werte zu konvertieren?

    
aland 13.08.2009, 17:37
quelle

7 Antworten

14

Wie auf der Hexdec-Manpage gesagt:

  

Die Funktion kann jetzt Werte konvertieren   Das sind zu groß für die Plattformen   Integer-Typ, es gibt den Wert zurück   als float in diesem Fall.

Wenn Sie eine große Ganzzahl (nicht float) erhalten möchten, müssen Sie sie in einer Zeichenfolge speichern. Dies ist möglicherweise mithilfe von BC Math Funktionen möglich.

Wenn Sie zum Beispiel in den Kommentaren der hexdec-Handbuchseite nachsehen, finden Sie diese Notiz

Wenn Sie diese Funktion etwas anpassen, um eine Notiz zu vermeiden, erhalten Sie:

%Vor%

(Diese Funktion wurde von der Notiz kopiert, mit der ich verlinkt habe; und nur ein bisschen von mir angepasst)

Und verwenden Sie es auf Ihre Nummer:

%Vor%

Die Ausgabe ist:

%Vor%

Also, nicht die Art von großem Schwimmer, die Sie hatten; und scheint in Ordnung mit dem, was Sie erwarten:

  

Ergebnis von calc.exe =   15406319846273791563


Ich hoffe das hilft ;-)
Und ja, Benutzerhinweise zur PHP-Dokumentation sind manchmal eine echte Goldgrube ;-)

    
Pascal MARTIN 13.08.2009, 17:46
quelle
4

hexdec () wechselt von int zu float, wenn das Ergebnis zu groß ist, um als int dargestellt zu werden. Wenn Sie beliebig lange Werte wünschen, müssen Sie wahrscheinlich eine eigene Konvertierungsfunktion ausführen, um die Hexadezimalzeichenfolge in GMP-Ganzzahl .

%Vor%     
Randy 13.08.2009 17:50
quelle
3

1.5406319846274E + 19 ist eine eingeschränkte Darstellung Ihrer Nummer. Sie können ein vollständigeres mit printf ()

haben %Vor%

... gibt "15406319846273792000" aus. PHP verwendet Floats für so große Zahlen, so dass Sie ein wenig Genauigkeit verlieren können. Wenn Sie mit beliebigen Präzisionszahlen arbeiten müssen, können Sie die Erweiterung bcmath ausprobieren. Wenn Sie das Hex in zwei 32-Bit-Wörter aufteilen (was auf den meisten Systemen sicher sein sollte), sollten Sie in der Lage sein, mehr Präzision zu erhalten. Zum Beispiel:

%Vor%

... würde $ f auf 15406319846273791563 setzen.

    
Josh Davis 13.08.2009 17:49
quelle
3

Konvertieren HEX zu DEC ist einfach .. Aber, rekonstruieren zurück Hexadezimalzahl ist sehr schwer. Versuchen Sie, base_convert zu verwenden.

%Vor%     
Felix 28.10.2012 13:23
quelle
2
%Vor%

Das ist das zu verwendende Modul. Konvertiere es in eine Funktion und verwende dann deine Zahlen.

Hinweis: Geben Sie diese Hexadezimalzahlen als Zeichenfolgen an:

%Vor%     
Enki 17.06.2012 23:13
quelle
1

Führen Sie dieses Problem beim Speichern von 64-Bit-Schlüsseln in der MySQL-Datenbank aus. Ich konnte mit einigen wenigen Binäroperatoren eine perfekte Konvertierung in eine 64-Bit-Ganzzahl mit Vorzeichen (PHP-Beschränkung) erzielen: (Dieser Code ist 16x schneller als die bchexdec-Funktion und die resultierenden Variablen verwenden im Durchschnitt die Hälfte des Speichers).

> %Vor%

Der von MySQL signierte BIGINT-Datentyp eignet sich hervorragend als Index oder Speicher im Allgemeinen. HEX (column) ist eine einfache Möglichkeit, es innerhalb der SQL-Abfrage zurück in HEX zu konvertieren, um es woanders zu verwenden.

    
ecrode 21.10.2017 16:26
quelle
0

Passt nicht intval(var, base) darauf?

Aus dem PHP-Handbuch .

    
mcandre 13.08.2009 17:43
quelle

Tags und Links