Dans mon projet, je fais appel à un fichier texte de plusieurs millier de lignes. Chaque ligne est un chiffre de moins de 256. Autrement dit, chaque ligne contient un chiffre qui tient sur 8bits (1 octet). Il se présente ainsi :
253
15
68
14
129
Dans ce fichier exemple, il prendra 20 octets sur le serveur. (octet d'ouverture, 1 octet par chiffre,1 octet pour chaque retour chariot etc...) Je le lis actuellement avec fgets()
L'idée serait d'avoir un fichier binaire qui stockerait le fichier précédent sous la forme suivante:
Ce qui nous donnerais un fichier de 5 octets sur le serveur au lieu de 20. Sachant que chaque fichier devrait contenir des milliers d'octets et qu'il devrait y avoir des milliers de fichiers différent, je pense que l'idée d’optimiser est une piste à suivre...
Mais je me trompe peut-être?
La question est donc la suivante, est-ce que mon idée est réalisable à mettre en place en php? quel serait alors les pistes?
Non je n'ai pas de code de test puisque ma question d'origine n'est pas de demander un code tout prêt, mais de savoir si ma réflexion est légitime ou pas... Ce que je demande n'est pas demandé 20 fois par semaine il me semble.
Franchement, marre de lire ce type de propos... Désolé
Non je n'ai pas de code de test puisque ma question d'origine n'est pas de demander un code tout prêt, mais de savoir si ma réflexion est légitime ou pas... Ce que je demande n'est pas demandé 20 fois par semaine il me semble.
Franchement, marre de lire ce type de propos... Désolé
- Edité par Nui Prabpai il y a 2 minutes
Tu as fait un algorithme ? de ce que tu veux de precis en francais?
apres le code c'est une autre etapes
et le binaire en php c'est pas ce quil y a de plus compliqu, un peu de recherche ou de réflexion et hop on est parit!
Apres je t'avoue que cet fonction je la connais simplement de nom(je l'ai trouver il y'a 10 jours quand je me suis balader sur la doc php), je ne sais pas le format de retour : si il y'a l'octet d'ouverture si les octets de retour chariot ... mais je pence que tu peut t'en sortir.
Edit :
Pour mes competence perso je te donne une piste :
<?php
// Lit un fichier, et le place dans une chaîne
$filename = "binaire.txt";
$handle = fopen($filename, "r");//on recupere le pointeur
$contents = fread($handle, filesize($filename));//on recupere ce qui a dans le fichier qui est pointer
fclose($handle);//on ferme le pointeur
echo $contents;//je fait un petit affichage pour voire ce qui resort (c'est pas du binnaire donc je le traduit)
$decouper = explode("\n", $contents);// je decoupe la chaine a tout les\n donc les retoure lignes
$concatenation = "";//initialisation de ma variable
foreach ($decouper as &$value) {//pour tout les occurences
echo decbin($value)."</br>";// on affiche pour tou bien voire
$concatenation .= decbin($value) ;// on ajoute a la chaine
}
echo $concatenation;// et on affiche le resultat final
?>
Je cherche à stocker mes données décimal en Binaire dans un fichier pour gagner de la place, hors si je lis bien ton code, tu récupères une données décimal que tu transformes pour un affichage binaire...
Je n'ai pas eu le temps de m'en occuper depuis tout à l'heure. je vais me concentrer sur ta première info ( fread )
C'est exactement ce que je veux faire, sauf que c'est du C. Bien que proche du PHP, ça reste différent....
Le tuto parle bien du Fread() et il utilise le mode "wb" pour écrire en binaire. Le mode "wb" n’existe pas dans le manuel PHP. Du coup, Je me dit que PHP ne gère pas directement en binaire, en tout cas, pas avec Fread()
Si une âme sensible pouvait me confirmer?
Peut-être @Vassili qui semble dire que c'est facile, mais qui ne partage pas ses connaissances?
- Edité par Nui Prabpai 19 octobre 2018 à 13:11:50
Le mode wb existe bien sur fopen pour ouvrir un fichier en mode binaire. En fait le 'b' est une option que tu peux appliquer sur le mode 'w' pour préciser que c'est en binaire.
Si tu traite toutes tes opérations (lecture/ecriture/ouverture) en mode binaire tu ne devrais pas avoir trop de soucis. Pense à bien utiliser fwrite et fread quand tu travaille avec des fichiers binaires.
Avec tout ça tu devrais pouvoir réecrire tes fichiers en mode binaire pour gagner de la place.
Je te met un extrait de la doc php sur le sujet :
Note:
Les systèmes d'exploitation utilisent différents caractères pour les nouvelles lignes. Lorsque vous écrivez un fichier texte, et insérez une nouvelle ligne, vous devez utiliser le bon caractère pour votre système d'exploitation. Les systèmes Unix utilisent \n comme nouvelle ligne, les systèmes Windows utilisent \r\n, et les systèmes Macintosh utilisent \r.
Si vous n'utilisez pas le bon caractère de nouvelle ligne lors de l'écriture de vos fichiers, vous risquez d'ouvrir vos fichiers avec des applications qui donneront un aspect 'bizarre' au texte.
Windows propose un mode de traduction ('t'), qui va traduire automatiquement les caractères \n en \r\n lorsque vous travaillez sur le fichier. À l'inverse, vous pouvez utiliser l'option 'b' pour forcer le fichier a être écrit en mode binaire, sans traduction des données. Pour utiliser ces options, ajoutez 'b' ou 't' comme dernier caractère du paramètre mode.
Pas de message d'erreurs du navigateur et le fichier data.bin est bien créer sur le disque. Mais, il fait 3 octets au lieu d'1. si j'ouvre le fichier avec notepad, il affiche 253 alors qu'il devrait m'afficher un caractère illisible s'il avait bien été inscrit en binaire.... J'ai oublié quelque chose?
- Edité par Nui Prabpai 19 octobre 2018 à 15:19:46
0b11111110 c'est 254 et pas 253.( jiimagine que cest une erreur de transcription) fwrite semble compter les caracteres et pourtant ils parlent d'octet mais aussi de byte dans la version anglaise ( 8 bits) ( si c une erreur c'.est gros )
donc ton code renvoi bien 3 puisque Il ecrit 3 caractere (254, 1 un ;un 5, un 4) dans ton fichier. donc si tu veux ecrire du binaire faut que tu laisses tel quel sans le 0b ( fwrite ecrit une chaine). j'ai pas eu le temps de bien capter ta problématique. mais l'interet du binaire c'est de mettre plusieurs infos dans une seule variable puis de l'analyser avec les O.B.S ;opérateur sur le bit. je pense que ce n'est pas cela que tu cherches.. au point de vu stockage 253 ne prends pas plus (ou moins) de place que 11111101. tu peux toujours faire ce que tu as fait (m^me si cest faux !)
253 15 68 14 129
donnerai 111111011111100010010000001 et pas 1111110100001111010001000000111010000001
mais ce n'est pas important. donc Fwrite ajoutant les ecriture les unes apres les autres tu peux le faire .
<?php
$fp = fopen('data.bin', 'w');
fwrite($fp, 11111101);
fwrite($fp, 1111);
fclose($fp);
// le contenu de 'data.bin' est maintenant 111111011111
?>
mais honnêtement je n'en vois pas l'intérêt car comment vas tu retrouver tes info une fois que tu auras une chaine de 40 caracteres et comment vas tu la découper pour retrouver tes infos? et surtout ou peut être le gain espéré?
pour moi ce que tu veux faire c'est ecrire en fait 253156814129 ( si on reste en décimal) mais j'en vois pas l'interet.
Bien entendu; j'ai pas forcement capté ce que tu voulais . lol
le fichier data.bin est bien créer sur le disque. Mais, il fait 3 octets au lieu d'1.
Les fonctions pack() et unpack() existent pour traduire les entiers php en binaire et inversement. Mais comme le besoin est toujours sur l'octet, il est peut être plus simple d'utiliser chr() et ord():
$fp = fopen('data.bin', 'wb');
fwrite($fp, chr(253)); // entier php 253 vers un octet binaire
fclose($fp);
$fp = fopen('data.bin', 'rb');
echo ord(fread($fp, 1)); // relire un octet binaire vers un entier php
fclose($fp);
// sinon pack/unpack
$bin = pack('s', 253); // s car un seul octet
echo ' retour en int ', unpack('s', $bin)[1];
Lecture binaire
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Jeune et ambitieux | Htmlspecialschars - Var_dump
Jeune et ambitieux | Htmlspecialschars - Var_dump