In PHP ist Binec () eine sehr praktische Funktion, um binäre Zeichenfolgen in Dezimalzahlen umzuwandeln. Die grundlegende Nutzung ist recht einfach:
echo bindec('1010'); // Ausgabe 10
Aber was passiert, wenn die eingehende binäre Zeichenfolge zu lang ist und den von PHP unterstützten Ganzzahlbereich überschreitet? Dies ist eine Frage, die es wert ist, untersucht zu werden, insbesondere wenn es um große Zahlen geht oder hochpräzise Berechnungen benötigt.
Zunächst müssen wir verstehen, dass der Bereich der Ganzzahl von PHP ( int ) durch die zugrunde liegende Plattform begrenzt ist. Bei den meisten 64-Bit-Systemen ist PHP_INT_MAX 9223372036854775807 , was ungefähr 2 <Sup> 63 </sup>-1 für 32-Bit-Systeme entspricht, gibt es nur 2147483647 .
Wenn der Wert, der durch die Binärzeichenfolge, die Sie übergeben, diesen Bereich überschreitet, diesen Bereich überschreitet, wandelt Binec () den Rückgabewert automatisch in den Schwimmertyp um. Dieses Verhalten ist Teil des Typsumwandlungsmechanismus in PHP und kann zu Genauigkeitsverlust führen.
Schauen wir uns ein Beispiel an:
$binary = '11111111111111111111111111111111111111111111111111111111111111111';
$result = bindec($binary);
var_dump($result);
Diese binäre Schnur ist 65 Bit lang, was viel größer ist als der Maximalwert einer 64-Bit-Ganzzahl. Die Ergebnisse der Operation können wie folgt sein:
float(1.84467440737096E+19)
Wie Sie sehen können, ist der Rückgabewert eine schwimmende Punktzahl und wird in wissenschaftlicher Notation ausgedrückt. Dies bedeutet auch:
Die Genauigkeit ist möglicherweise nicht mehr genau;
Wenn Sie dieses Ergebnis für weitere mathematische Berechnungen verwenden, können unvorhersehbare Fehler eingeführt werden.
Wenn Sie Binärzahlen, die den Ganzzahlbereich genau überschreiten, genau verarbeiten müssen, sollten Sie die BCMATH- oder GMP -Erweiterung von PHP verwenden:
Verwenden von BCMath:
$binary = '10101010101010101010101010101010101010101010101010101010101010101';
$decimal = '0';
$length = strlen($binary);
for ($i = 0; $i < $length; $i++) {
$bit = $binary[$i];
$power = bcpow('2', $length - $i - 1);
if ($bit === '1') {
$decimal = bcadd($decimal, $power);
}
}
echo $decimal; // Ausgabe精确的十进制值
Mit GMP:
$binary = '10101010101010101010101010101010101010101010101010101010101010101';
$gmp = gmp_init($binary, 2);
echo gmp_strval($gmp); // 精确Ausgabe
BCMath ist eine reine PHP -Implementierung mit besserer Kompatibilität. Die GMP -Bibliothek ist in der Leistung stärker, erfordert jedoch Serverunterstützung.
In einigen Datenverarbeitungsszenarien, wie z. B. die Verarbeitung von IP-Adressen, Bit-Berechtigungsverwaltung, Verschlüsselungsalgorithmen usw., ist die Verarbeitung großer Binärdaten eine häufige Aufgabe. Wenn Sie BindEc () direkt verwenden, ist dies wie folgt:
bindec('1001011100101101001010010010101010010101010101010101010101010101');
Und der Versuch, es als Benutzerberechtigungsmaske zu verwenden, kann bei nachfolgenden Urteilen die Genauigkeit verlieren und ein Sicherheitsrisiko darstellen. BCMATH oder GMP sollte bevorzugt werden, um eine numerische Genauigkeit zu gewährleisten.
Obwohl BindEc () bei der Behandlung kleiner und mittlerer Binärzeichenfolge effizient und bequem ist, wechselt sein Verhalten automatisch, um zum schwimmenden Punkttyp zurückzukehren, wenn sich die Eingabedaten außerhalb des Bereichs der PHP -Ganzzahl befinden, was zu Genauigkeitsproblemen führen kann. Entwickler sollten bei der Bearbeitung von Binärzahlen mit hohen Bit-Zahlen besonders vorsichtig sein und bei Bedarf hochpräzise mathematische Bibliotheken verwenden, um die Datengenauigkeit zu gewährleisten.