Developpez.com - Rubrique PHP

Le Club des Développeurs et IT Pro

Astuce PHP : Écrire du binaire dans un fichier

Le 2006-08-29 17:32:04, par hpalpha, Membre émérite
Bonjour,

je souhaite ecrire un fichier en binaire avec php, seulement fwrite prend un string, or pour ecrire l'entier 104 dans mon fichier, il va m'écrire 104 en 3 octets ( 1 0 4 ) comme une chaine, alors que moi je veux sur 1 octet de valeur 104 --> D

en attendant je pourrais utiliser : fwrite($fichier,chr(104),1);
mais pour les entiers > 255 ????
et surtout pour les float ???

exemple de code :
Code :
1
2
3
4
5
6
7
8
<?
 $fichier=fopen('out.tst', 'wb+');
 fwrite($fichier,chr(0x02),1);
 $ff=-1.75440;
 fwrite($fichier,$ff,4);
 fwrite($fichier,chr(0x00),1);
 fclose ($fichier);
?>
  Discussion forum
5 commentaires
  • ePoX
    Membre éprouvé
    Salut,

    C'est peut être une proposition bête... Mais bon n'ayant jamais fait de C le binaire tout sa ce n'est pas tasse thé :s

    Bref peut être en utilisant sprintf avec l'option %b

    tiré de http://www.php.net/manual/fr/function.sprintf.php :
    Code :
    printf("%%b = '%b'\n", $n); // représentation binaire
    Bien sur il faudra utiliser sprintf pour obtenir une string et non un affichage sur la sortie standard.

    bbye
  • Taum
    Membre éprouvé
    Salut,

    Il faut utiliser pack() pour obtenir la représentation en chaine binaire.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $fichier = fopen('out.tst', 'wb+');
    
    $b = pack("c", 0x02); // 0x02 comme char
    fwrite($fichier,$b);
    
    $ff=-1.75440;
    $b = pack("f", $ff); // $ff comme float
    fwrite($fichier,$b);
    
    fwrite($fichier, pack("c", 0x00)); // fonctionne bien sur également sans variable intermédiaire
    
    fclose ($fichier);
  • hpalpha
    Membre émérite
    Super merci, je connaissait pas, ca marche super bien.
  • hpalpha
    Membre émérite
    Pour ceux que ca interresse, voici la premiere fonction en php d'export au format OV2 :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <?
     /*
      Exportation d'une table bdd en format OV2 (Tomtom)
    
      (c) Damien Griessinger (HpAlpha)
       
     */
    
    
     function packerligne($longitude,$latitude,$description)
     {
      return chr(0x02).pack("V",strlen($description)+14).pack("V",round($longitude*100000)).pack("V",round($latitude*100000)).$description.chr(0x00);
     }
     
     function db2ov2($nomfichier)
     {
      $fichier=fopen($nomfichier, 'wb+');
      $db = pg_connect("host=$dbserveur dbname=$dbdatabase user=$dbuser password=$dbpass")
        or die('Error Connexion : ' . pg_last_error());
      $resultat=pg_query("SELECT longitude,latitude,description FROM t_poi");
      while($out=pg_fetch_array($resultat)){  
       fwrite($fichier,packerligne($out['longitude'],$out['latitude'],$out['description']));
      }
      fclose ($fichier);
      pg_free_result($resultat);
      pg_close($db);
     }
     
     db2ov2('out.ov2');
    ?>
  • PIEPLU
    Membre régulier
    Super ce code. Par contre, vous pouvez m'expliquer un peut cette ligne :

    Code :
     return chr(0x02).pack("V",strlen($description)+14).pack("V",round($longitude*100000)).pack("V",round($latitude*100000)).$description.chr(0x00);
    Merci