In der PHP -Entwicklung stoßen wir häufig auf Situationen, in denen binäre Daten aus MySQL -Datenbanken gelesen werden müssen. Insbesondere wenn binäre Felder (z. B. binäre , variäarische oder Bittypen ) in der Datenbank gespeichert werden, ist die korrekte Umwandlung dieser Daten in Dezimalwerte zu einem relativ häufigen Problem geworden. PHP liefert eine Bindec -Funktion zum Umwandeln von Binärzeichenfolgen in Dezimalzahlen, aber Sie stoßen häufig auf einige Fallstricke, wenn Sie sie direkt verwenden.
In diesem Artikel wird detailliert erläutert, wie die Funktion Binec , um binäre Felddaten aus MySQL korrekt zu verarbeiten.
Angenommen, die Datenbank hat eine solche Felddefinition:
CREATE TABLE example (
id INT PRIMARY KEY,
bin_data BINARY(4)
);
Binärdaten speichern in:
INSERT INTO example (id, bin_data) VALUES (1, 0b1011);
Wenn Sie PDO oder MySQLI in PHP abfragen, wird das Feld Bin_data als Zeichenfolge zurückgegeben, aber die Zeichenfolge ist zu diesem Zeitpunkt binärer Inhalt, nicht der Text "1011" oder "11", sondern der entsprechende Byte -Stream.
Zum Beispiel kann es nach dem Ausführen ein roher Byte wie "\ x0b \ x00 \ x00 \ x00" sein und das Ergebnis des direkten Aufrufens von BindEc ist falsch.
Die Argumente der Bindec -Funktion sollten Zeichenfolgen wie "1011" sein. Wenn Sie ihm einen Binär -Byte -Stream direkt angeben, wird der Bytewert nicht analysiert, sondern ihn durch Zeichen interpretiert, was zu einem Fehlerergebnis führt.
Verwenden Sie die integrierten Funktionen von PHP, um sie in "0" und "1" -Saiten per Byte umzuwandeln, und analysieren Sie sie dann mit Binesec .
Beispielcode:
<?php
// Annehmen von MySQL Das binäre Feld entfernt
$binaryData = "\x0B"; // Dezimal11,Entsprechend binär1011
// Konvertieren Sie einen Byte -Stream in eine binäre Zeichenfolge
function binaryToBitString(string $binary): string {
$bitString = '';
for ($i = 0; $i < strlen($binary); $i++) {
// ord() Holen Sie sich Charaktere ASCII Code,Konvertieren zu8Bit Binärer String
$bitString .= str_pad(decbin(ord($binary[$i])), 8, '0', STR_PAD_LEFT);
}
return $bitString;
}
$bitString = binaryToBitString($binaryData);
echo "Bit string: " . $bitString . "\n";
// verwenden bindec 转换为Dezimal数
$decimalValue = bindec($bitString);
echo "Decimal value: " . $decimalValue . "\n";
?>
Ausgangsergebnis:
Bit string: 00001011
Decimal value: 11
Dadurch werden Binärdaten, die von MySQL entnommen wurden, korrekt in Dezimalzahlen umwandelt.
Wenn das Feld von Bittyp ist, können Sie es bei der Abfrage in eine Dezimalzahl unter Verwendung der MySQL -Funktion konvertieren, z. B. bei der Abfrage:
SELECT id, BIN(bin_data) AS bin_str FROM example;
Oder konvertieren Sie es direkt in eine Ganzzahl:
SELECT id, CONV(HEX(bin_data), 16, 10) AS decimal_value FROM example;
Auf diese Weise ist das, was Sie direkt auf der PHP -Seite erhalten, binär oder dezimal in Form von Zeichenfolgen, wodurch die komplexe Verarbeitung von binären Byteströmen vermieden wird.
Die Bindec -Funktion kann nur binäre Zeichenfolgen aus "0" und "1" verarbeiten und unterstützt binäre Byte -Streams nicht.
Die von MySQL entnommenen Binärfelder sind normalerweise Byte -Streams und müssen vor der Verwendung von Bindec in binäre Zeichenfolgen umgewandelt werden.
Sie können Funktionen Byte-byte-Konvertierung selbst schreiben oder die Funktionsvorverarbeitung bei SQL-Abfragen verwenden.
Wählen Sie den entsprechenden Verarbeitungsplan gemäß der tatsächlichen Situation, um eine Fehlinterpretation von Binärdaten zu vermeiden.