Flux rss

Parser un fichier binaire en PHP

Publié par kilian, dernière mise à jour le mercredi 10 septembre 2008 à 17:59:48 par Ssylvainsab
Supposons que vous ayez enregistré des données binaires dans un fichier, c'est-à-dire un enregistrement brut qui n'est pas traduit en texte.
C'est une chose que l'on fait couramment avec certains langages de bas niveau comme le C ou le Pascal.

Voici un exemple en C, mettons que vous vouliez enregistrer la valeur 500 dans un fichier, le code sera le suivant:
#include <stdio.h>

int main()
{
    int val = 500;
    FILE *fp = fopen("fichier", "wb");
    
    fwrite(&val, sizeof(int), 1, fp); //Enregistrement de val dans "fichier"
    fclose(fp);
    return 0;
}


Si vous ouvrez le fichier enregistré avec un éditeur de texte, vous risquez de trouver un charabia car votre valeur n'est pas enregistrée sous forme de texte mais sous forme brute, binaire.

Or, si vous utilisez un langage comme le PHP, il se peut que vous ayez besoin de récupérer des valeurs enregistrées en binaire un jour ou l'autre. Toutefois PHP ne lit et n'écrit dans les fichiers que sous forme de texte. Il faut donc passer par une fonction spécifique pour récupérer vos valeurs correctment.

La solution


La fonction unpack() est là pour résoudre ce genre de souci.
En premier argument, vous devez signaler le type de la donnée que vous voulez récupérer et en deuxième argument, la chaîne depuis laquelle vous récupérez ces données.

Le type de la donnée à récupérer doit être détaillé sous la forme d'un caractère symbolique. Par exemple, pour récupérer un entier signé (type int en C), on utilisera le caractère "i".

Donc si on se réfère au fichier que nous venons d'enregistrer dans l'exemple au-dessus, voici le code pour récupérer notre valeur:
<?
$fp = fopen("fichier", "rb");
$data = fread($fp, 4); //4 est la taille en octets d'un entier sur un PC 32 bits.
$nombre = unpack("i", $data);
echo $nombre[1]; //affichera 500
?>

Attention, les remarques qui suivent sont très importantes:
  • La taille des données peut changer selon les architectures de processeur. Un même programme écrit en C utilisera des entiers de tailles différentes en passant d'un PC 32 bits à 64 bits. La taille pourra également être différente d'une architecture de processeur à l'autre (Sparc, Arm, PowerPc etc...).
  • L'agencement des données pourra ne pas être le même. Certaines machines enregistrent les données en Big Endian, d'autres en Little Endian.
  • La taille des données peut aussi varier selon le compilateur.
  • La fonction unpack retourne un tableau pour permettre une utilisation un peu plus élaborée que celle donnée ici en exemple. Dans notre cas, avec une seule valeur demandée, notre valeur est située dans l'offset 1 du tableau.

Equivalences formats / types de données pour architecture PC 32 bits


Les formats utilisables sont documentés à cette adresse.
Voici un petit tableau d'équivalence pour les données enregistrées par un programme en C compilé pour un PC 32 bits.
Méfiez-vous, ces équivalences ne sont pas forcément valables selon le compilateur utilisé pour compiler le programme qui a produit le fichier, sans compter d'autres paramètres qui rentrent en jeu. Aussi, je vous recommande fortement de tester votre programme, aussi bien avec des petites valeurs que des grandes.
De même, ces équivalences sont données à titre théorique, je ne les ai pas testées.

char : c
unsigned char : C
short : s
unsigned short : S
int : l
unsigned int : L
float : f
double : d

Résultats pour Parser un fichier binaire en PHP

[Shell] Affichage d'un fichier binaire: Terminal illisible Lorsque vous affichez par mégarde le contenu d'un fichier binaire (par exemple cat /bin/mount | more), il peut arrivé que le terminal affiche des caractères non imprimables, ce qui provoque un affichage totalement illisible avec des caractères... www.commentcamarche.net/faq/sujet-972-shell-affichage-d-un-fichier-binaire-terminal-illisible
Supression de fichier en PHP avec unlink(URL) (Résolu) Bonjour, m'etant renseigner sur la supression de fichier en php, j'utilise la fonction unlink(chemin) : Voici mon code : $query = "SELECT * FROM docs WHERE id = ".$id; $result = mysql_query($query, $cnx); while($row =... www.commentcamarche.net/forum/affich-7434531-supression-de-fichier-en-php-avec-unlink-url
Crée fichier avec php (Résolu) Bonjour, je voudrais savoir comment crée des fichiers avec php je vous explique mieux avec de exemple sinon vous allez pas comprendre alors par exemple, c'est un site comme e-monsite qui crée des site gratuit pour les gens en ligne... www.commentcamarche.net/forum/affich-8915118-cree-fichier-avec-php

Résultats pour Parser un fichier binaire en PHP

[PHP] Upload de fichiersLe langage PHP permet de gérer des fichiers envoyés (uploadés) grâce à un formulaire HTML. Formulaire d'envoi de fichiers Configuration de PHP pour permettre l'upload Récupération du fichier avec PHP Formulaire d'envoi de fichiers La... www.commentcamarche.net/faq/sujet-889-php-upload-de-fichiers

Résultats pour Parser un fichier binaire en PHP

Parser XML en PHP (Résolu)Bonjour à tous, je voudrai faire un parseur XML en php qui permet de créer pour chaque feuille du fichier XML, une variable (avec comme nom, celui de la feuille) avec comme valeur, celle de la feuille. Je m'explique. Voici mon fichier XML :... www.commentcamarche.net/forum/affich-3173647-parser-xml-en-php
Upload de plusieurs fichier en PHP (Résolu)Bonjour, J'ai un petit soucis lors du upload de fichier en PHP mais avec plusieurs fichiers. Mon code fonctionne pour le upload de un fichier, mais ce que je veux c'est en uploader plusieurs. J'ai fais des recherches mais sans... www.commentcamarche.net/forum/affich-5761240-upload-de-plusieurs-fichier-en-php
[Java] Fichier binaire (Résolu)Bonjour, J'ai un problème en Java, j'aimerais avoir votre avis ! Je dois faire un éditeur capable d'enregistrer le texte que l'utilisateur a entré à la suite d'un fichier binaire... Mais ça fait pas mal de temps que je me... www.commentcamarche.net/forum/affich-6375205-java-fichier-binaire

Résultats pour Parser un fichier binaire en PHP

Télécharger NewObjects ActiveX Pack1NewObjects ActiveX Pack1 est un pack de composants ActiveX. Il permet la gestion ou l’accès de fichiers en mode binaire et texte. L’enregistrement est basé sur un accès au hasard dans des flux et fichiers binaires. Il supporte les fichiers combinés... www.commentcamarche.net/telecharger/telecharger-34056891-newobjects-activex-pack1

Résultats pour Parser un fichier binaire en PHP

PHP - Les fichiersLa gestion des fichiers avec PHP Avec PHP, la création ou la lecture de fichiers est, une fois de plus, assez simple. Il existe une multitude de fonctions dédiées à l'utilisation des fichiers. La communication entre le script PHP et le fichier... www.commentcamarche.net/contents/php/phpfich.php3
Fichier CUEFormat CUE Les fichiers [bin.php3 BIN] et CUE sont respectivement : .BIN : une image de CD, c'est-à-dire une copie binaire d'un CD-ROM ou d'un DVD-ROM sous forme d'un fichier pouvant être stocké sur disque dur. .CUE : informations sur les... www.commentcamarche.net/contents/fichier/cue.php3
Fichier DATFormat DAT Un fichier DAT Un fichier .dat est un fichier de données (.DAT signifie data). En général, il s'agit d'un fichier binaire, créé par un programme et utilisable uniquement par ce programme, ce qui signifie qu'il n'est pas censé être ouvert... www.commentcamarche.net/contents/fichier/dat.php3