Bon,

Ce problème de binaire avec PHP me laissait sur ma faim. J'ai donc fait 
quelques essais hier soir et la conclusion est la suivante :

Il est possible de lire et d'écrire du binaire avec les fonction fread et 
fwrite. Il y a toutefois quelques restrictions. 

Il est impératif de passer l'argument "length" pour chacune de ces fonctions. 
En l'absence de valeur de longueur, fread et fwrite se comportent exactement 
comme fgets/fputs; cad que ce qui est lu/écrit est considéré comme une chaîne 
de caractère. Le problème est que la fonction fread ne retourne PAS le nombre 
de bytes lus ! Il faut donc que vous sachiez exactement combien de bytes ont 
effectivement été lus dans votre buffer... Surtout si vous désirez ensuite 
écrire se même buffer dans un fichier (ou autre). 

Petit programme d'exemple :

<?
        $Buffer = "abcd\0001234";
        $stream = fopen("toto", "w");
        fwrite($stream, $Buffer, 9);
        fclose($stream);
        $stream = fopen("toto", "r");
        $NewBuf = fread($stream, 9);
        fclose($stream);
        $stream = fopen("titi", "w");
        fwrite($stream, $NewBuff, 9);
        fclose($stream);
?>

Les deux fichiers générés sont identiques et contiennent bien les 9 
caractères de Buffer, y compris le NULL (od -c).

Ce qui est surprenant est que dans le manuel de la fonction fwrite il est dit 
:

fwrite() writes the contents of string to the file stream pointed to by fp. 
If the length argument is given, writing will stop after length bytes have 
been written or the end of string is reached, whichever comes first.

Ouai... ben j'crois que le "whicever comes first" n'a pas l'air de 
fonctionner très bien... heureusement pour moi dans ce cas :-) Par contre je 
crois qu'il ne faudrait pas trop compter dessus car :

- Soit c'est un bug et le code doit se comporter comme décrit dans la doc.
- Soit c'est un bug de la doc...

Voilà, c'est une demie bonne nouvelle et ça devrait clore le sujet pour 
l'instant.

Daniel

--
http://www-internal.alphanet.ch/linux-leman/ avant de poser
une question. Ouais, pour se désabonner aussi.

Reply via email to