Dans le développement de PHP, nous rencontrons souvent des situations où les données binaires doivent être lues à partir de bases de données MySQL. Surtout lorsque les champs binaires (tels que les types binaires , varbinaires ou de bits ) sont stockés dans la base de données, comment convertir correctement ces données en valeurs décimales est devenue un problème relativement courant. PHP fournit une fonction Bindec pour convertir les chaînes binaires en entiers décimaux, mais vous rencontrez souvent des pièges lorsque vous les utilisez directement.
Cet article expliquera en détail comment utiliser correctement la fonction Bindec pour traiter les données de champ binaire tirées de MySQL.
Supposons que la base de données ait une telle définition de champ:
CREATE TABLE example (
id INT PRIMARY KEY,
bin_data BINARY(4)
);
Stockez les données binaires dans:
INSERT INTO example (id, bin_data) VALUES (1, 0b1011);
Lors de l'interrogation via PDO ou MySQLI dans PHP, le champ BIN_DATA sera renvoyé sous forme de chaîne, mais la chaîne à l'heure actuelle est du contenu binaire, pas du texte "1011" ou "11", mais le flux d'octet correspondant.
Par exemple, après avoir retiré, il peut s'agir d'un octet brut comme "\ x0b \ x00 \ x00 \ x00" et le résultat de l'appel Bindec est incorrect.
Les arguments de la fonction Bindec doivent être des chaînes comme "1011" . Si vous lui donnez directement un flux d'octets binaires, il n'analyse pas la valeur d'octets, mais l'interprétera par caractère, ce qui entraînera un résultat d'erreur.
Utilisez les fonctions intégrées de PHP pour les convertir en chaînes "0" et "1" par octet, puis les analyser avec Bindec .
Exemple de code:
<?php
// Supposer de MySQL Le champ binaire supprimé
$binaryData = "\x0B"; // Décimal11,Binaire correspondant1011
// Convertir un flux d'octet en une chaîne binaire
function binaryToBitString(string $binary): string {
$bitString = '';
for ($i = 0; $i < strlen($binary); $i++) {
// ord() Obtenir des personnages ASCII code,Se convertir8Bit Binary String
$bitString .= str_pad(decbin(ord($binary[$i])), 8, '0', STR_PAD_LEFT);
}
return $bitString;
}
$bitString = binaryToBitString($binaryData);
echo "Bit string: " . $bitString . "\n";
// utiliser bindec 转换为Décimal数
$decimalValue = bindec($bitString);
echo "Decimal value: " . $decimalValue . "\n";
?>
Résultat de sortie:
Bit string: 00001011
Decimal value: 11
Cela convertira correctement les données binaires tirées de MySQL en nombres décimaux.
Si le champ est de type bit, vous pouvez le convertir en un numéro décimal en utilisant la fonction MySQL lors de la requête, par exemple:
SELECT id, BIN(bin_data) AS bin_str FROM example;
Ou convertissez-le directement en un entier:
SELECT id, CONV(HEX(bin_data), 16, 10) AS decimal_value FROM example;
De cette façon, ce que vous obtenez directement du côté PHP est binaire ou décimal sous forme de chaînes, en évitant le traitement complexe des flux d'octets binaires.
La fonction Bindec ne peut gérer que des chaînes binaires composées de "0" et "1" et ne prend pas en charge les flux d'octets binaires.
Les champs binaires tirés de MySQL sont généralement des flux d'octets et doivent être convertis en chaînes binaires avant d'utiliser Bindec .
Vous pouvez écrire vous-même des fonctions d'octets, ou vous pouvez utiliser le prétraitement des fonctions pendant les requêtes SQL.
Choisissez le plan de traitement approprié en fonction de la situation réelle pour éviter une mauvaise interprétation des données binaires.
Étiquettes associées:
MySQL