En PHP, qu'est-ce que cela signifie par une fonction binaire sûre?

Dans PHP ce qui signifie-t-il par une fonction binary-safe ?

Qu'est-ce qui les rend spéciaux et où sont-ils généralement utilisés ?

101
php
demandé sur Zacky112 2010-07-16 15:52:16

3 réponses

Cela signifie que la fonction fonctionnera correctement lorsque vous lui transmettez des données binaires arbitraires (c'est-à-dire des chaînes contenant des 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 terminées par null, donc si la chaîne contient un caractère null, la fonction ignorerait tout ce qui suit.

Ceci est pertinent car PHP ne sépare pas proprement la chaîne et les données binaires.

89
répondu Michael Borgwardt 2010-07-16 12:39:12

Les autres utilisateurs déjà mentionné ce que binary safe signifie en général.

En PHP, le sens est plus spécifique, se référant uniquement à ce que Michael donne à titre d'exemple.

Toutes les chaînes en PHP ont une longueur associée, qui est le nombre d'octets qui le composent. Lorsqu'une fonction manipule une chaîne, elle peut soit:

  1. comptez sur ces méta-données de longueur.
  2. comptez sur la chaîne terminée par null, c'est-à-dire qu'après les données qui font réellement partie de la chaîne, un un octet avec la valeur 0 apparaîtra.

Il est également vrai que toutes les variables PHP de chaîne manipulées par le moteur sont également terminées par null. Le problème avec les fonctions qui reposent sur 2., est-ce 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 stade et ignorera tout après cela.

Par exemple, si la fonction strlen de PHP fonctionnait comme la bibliothèque standard C strlen, le résultat ici serait faux:

$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
77
répondu Artefacto 2014-12-17 05:51:09

d'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: chaînes PHP

0x00 = NULL
0x04 = EOT (End of transmission)

Table ASCII pour voir la liste de caractères ASCII

52
répondu Subscriberius 2014-11-28 10:55:22