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?
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 ;-)
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%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.
Konvertieren HEX zu DEC ist einfach .. Aber, rekonstruieren zurück Hexadezimalzahl ist sehr schwer. Versuchen Sie, base_convert zu verwenden.
%Vor%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.