[PHP] Lecture binaire

yo! les geeks,

Je suis en train d’écrire un script PHP pour lire les fichiers Paradox.
Or, je bloque complètement sur la lecture de fichiers binaires en PHP.
En l’occurence, pour lire deux octets qui forment un signed short, si je fais :
$recordsize=fread($fin,2);
echo $recordsize;
echo “
”;
echo (int)$recordsize;

J’obtiens en 1ère ligne les caractères ASCII correspondants à mes deux octets (normal, fread retourne une string).
Et sur la 2e ligne, j’ai 0 !
Apparemment le cast ne fonctionne pas à cause du non typage du PHP.
Quelqu’un aurait une solution pour ce genre de problème ? Je suis super moyen motivé pour me taper l’écriture d’une extension PHP, donc si ça peut être en PHP pur : joie.

Merci
Antoine

[quote]Apparemment le cast ne fonctionne pas à cause du non typage du PHP.[/quote]Euh, le cast fonctionne très bien, c’est même vital en PHP vu que c’est le seul moyen de typer explicitement !

Simplement (int)string, ca revient à 12 si ta chaine était “12”…

En l’occurence ce que tu veux faire c’est récuperer la valeur d’un entier codé sur 16 bits, donc tu dois juste savoir si c’est du big indian ou du little indian, et faire :

$monentier = $buffer[0] + (256 * $buffer[1]);

ou inverser 0 et 1, donc.

Mais sinon, as tu pensé à utiliser fscanf() ?

Marche pas dans les deux cas. PHP n’arrive à pas à considérer un caractère comme une valeur numérique. J’ai fini par trouver une solution. Elle est hardcore-lourdingue mais elle fonctionne.
J’utilise bin2hex() qui prend une string  en binaire et ressort une string avec les codes en hexa. “AB” donne “4142”. Ensuite je convertis en décimal avec hexdec().
MAIS… Evidemment, lors de la lecture l’indian n’est pas bon. Donc avant toute chose, je dois inverser ma chaine. Ce qui nous donne au final cette merveilleuse ligne :

$numrecords=hexdec(bin2hex(strrev(fread($fin,4))));

Oui, je sais…

Antoine