Dans PHP
qu'est-ce que cela signifie par une fonction étant binary-safe
?En PHP, que signifie une fonction binaire-safe?
Qu'est-ce qui les rend spéciaux et où sont-ils habituellement utilisés?
Dans PHP
qu'est-ce que cela signifie par une fonction étant binary-safe
?En PHP, que signifie une fonction binaire-safe?
Qu'est-ce qui les rend spéciaux et où sont-ils habituellement utilisés?
Cela signifie que la fonction fonctionne correctement lorsque vous passez des données binaires arbitraires (à savoir des chaînes contenant octets non-ASCII et/ou des octets nuls). Par exemple, une fonction non binaire peut être basée sur une fonction C qui attend des chaînes à terminaison nulle, donc si la chaîne contient un caractère nul, la fonction ignorera tout ce qui la suit.
Ceci est pertinent car PHP ne sépare pas proprement les données chaîne et binaires.
Les autres utilisateurs déjà mentionné ce binary safe
signifie en général.
En PHP, le sens est plus spécifique, se référant uniquement à ce que Michael donne comme exemple.
Toutes les chaînes en PHP ont une longueur associée, qui sont le nombre d'octets qui le composent. Lorsqu'une fonction manipule une chaîne, elle peut:
0
apparaît.Il est également vrai que toutes les variables PHP de chaîne manipulées par le moteur ont également une terminaison nulle. Le problème avec les fonctions qui dépendent de 2., est que, si la chaîne elle-même contient un octet avec la valeur 0
, la fonction qui la manipule pensera que la chaîne s'est terminée à ce point et ignorera tout après cela.
Par exemple, si la fonction de PHP strlen
a travaillé comme C bibliothèque standard strlen
, ici le résultat serait une erreur:
$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
Autres exemples:
<?php
$string1 = "Hello";
$string2 = "Hello\x00World";
// This function is NOT ! binary safe
echo strcoll($string1, $string2); // gives 0, strings are equal.
// This function is binary safe
echo strcmp($string1, $string2); // gives <0, $string1 is less than $string2.
?>
\x
indique la notation hexadécimale . Voir: PHP strings
0x00 = NULL
0x04 = EOT (End of transmission)
ASCII table voir liste char ASCII
Meilleur expliqué. –
Juste pour m'assurer que j'ai compris, alors 'Hello \ r \ nWORLD' ne devrait pas être le même que' Hello' si la fonction est binaire sûre, non? –
En outre, comment une telle fonction est-elle implémentée? Existe-t-il une expression régulière qui vérifie que son binaire est sûr ou utilise-t-il une méthode différente? –
Est-ce que cela veut dire que les chaînes de sécurité binaires ne contiennent que « caractères » de longueur 1 octet? –
@CharlieParker: Non, vous avez ça en arrière. La sécurité binaire est une propriété de * functions * ce qui signifie qu'ils traitent * any * string correctement. L'inverse serait une chaîne qui contient seulement des caractères ASCII * et * aucun caractère nul - une telle chaîne devrait être traitée correctement par n'importe quelle fonction. –
peut-être que je suis confus parce que je lisais le protocole redis pour "les chaînes en bloc" et il a dit qu'ils représentent une chaîne "binaire binaire unique". Je pense que je comprends votre message correctement maintenant. Cependant, est-il logique de dire qu'une chaîne est "binaire sûre" (comme dans l'exemple que j'ai fourni)? –