TourDeJeu, le réseau des jeux en ligne alternatifs : jeux web multijoueurs, jeux par forum. En savoir +

Flux RSS des discussions du forum : pour les joueurs, et pour les créateurs et MJ
  Reply to this topicStart new topicStart Poll

> Php : Créer Un Fichier Plein De Vide, un fichier prérempli de 0
zumba
Ecrit le : Vendredi 30 Mars 2007 à 13h56
Quote Post


Ouf
*

Groupe : Membre
Messages : 496


Hello,
Comment pour créer un fichier php contenant 1000 fois (par exemple) le mot hexa 0x0000000000 (5 octets à valeur 0) sachant qu ele mot hexa pourrait être aussi autre chose genre 0x000054B02C...
mais qu'à la fin mon fichier devra toujours faire 5000 octets qq soit le motif.

je mets mon code actuel qui marche pas (n'écrit qu'un octet sur 5 pour 00000, en gros il zappe tous les bits à 0 jusqu'à en rencontrer un à 1)

CODE
function createDefaultFow($id,$w,$h,$fill=0x0000000000)
{

$case=Array(5);
$case=$fill&0x0000000000;
$fm=fopen("./maps/$id.fow","w+");
for($i=0;$i<$w;$i++)
 for($ii=0;$ii<$w;$ii++)
  fwrite($fm,$fill);

fclose($fm);  
}

Merci,
zumba


--------------------
Z
PMEmail Poster
Top
Haiken
Ecrit le : Vendredi 30 Mars 2007 à 18h22
Quote Post


Ouf
*

Groupe : Membre
Messages : 360


A priori ça doit donner un truc comme ça (non testé)

CODE
function createDefaultFow($id,$w,$h,$fill=0x0000000000)
{

$fm=fopen("./maps/$id.fow","w+");
for($i=0;$i<$w;$i++)
for($ii=0;$ii<$h;$ii++)
 fwrite($fm,pack('H5', str_pad(dechex($fill),10,'0',STR_PAD_LEFT)));

fclose($fm);  
}


--------------------
PMEmail Poster
Top
zumba
Ecrit le : Vendredi 30 Mars 2007 à 18h45
Quote Post


Ouf
*

Groupe : Membre
Messages : 496


yop, gracié mais no esta fonctionnade... il m'écrit des mots de 3 octets, je pige pas trop pk.


--------------------
Z
PMEmail Poster
Top
naholyr
Ecrit le : Samedi 31 Mars 2007 à 11h23
Quote Post


Ouf
*

Groupe : Membre
Messages : 423


Normal, tu veux écrire une chaine utilise une chaine wink.gif
Pour PHP le nombre 00000 est simplement... 0. Pourquoi écrirait-il autre chose ? wink.gif

Il faut donc que tu utilises des chaines de 5 caractères et pas un code hexa, sinon tu n'y arriveras jamais : à chaque fois que les N premiers octets seront des "0" il les ignorera.
Si vraiment tu n'as pas le choix et que ton paramètre doit absolument être un code hexa (je ne vois pas trop dans quel cas on aurait cette contrainte), le plus simple est de le convertir en chaîne avant. Mettons que tu aies 0x00007a756d, on va le transformer en chaine octet par octet via chr, et combler avec str_pad :
CODE
function hexstr($hex)
{
   $str = '';
   while ($hex != 0) {
       $byte = $hex % 256;
       $str = chr($byte) . $str;
       $hex = ($hex-$byte) / 256;
   }
   return $str;
}

echo str_pad(hexstr(0x00007a756d), 5, '0', STR_PAD_LEFT);
Affichera bien "00zum" wink.gif

Il suffit donc de convertir au début de ta fonction
CODE
function createDefaultFow($id,$w,$h,$fill=0x0000000000)
{
   $fill = str_pad(hexstr($fill), 5, '0', STR_PAD_LEFT);
   $fm=fopen("./maps/$id.fow","w+");
   for($i=0;$i<$w;$i++)
       for($ii=0;$ii<$h;$ii++)
           fwrite($fm,$fill);
   fclose($fm);  
}
PMEmail PosterUsers WebsiteICQYahoo
Top
zumba
Ecrit le : Lundi 02 Avril 2007 à 17h16
Quote Post


Ouf
*

Groupe : Membre
Messages : 496


Salut Naholyr,
merci t'es décidément balèze en algo/code (tu m'avais déjà sorti un algo de création de poules sportives).

Mais là y reste un souci, et je pige vraiment pas ce qui se passe, je me demande si il y a pas une subtilité genre automatisme système là dessous :

en gros si j'appelle createDefaultFog avec $fill=0x0008AF0892
il me le remplit avec des mots hexa "30 08 AF 08 92" donc substitue le premier 0 par un 3.
EN fait il traduit la chaine hexa "00" en valeur hexa "30".

Pourtant rien n'explique cela dans le code. Une idée ?

Merci !
z

(ps : fais moi penser à te soumettre un autre algo bien bien velu un de ces 4)


--------------------
Z
PMEmail Poster
Top
Haiken
Ecrit le : Lundi 02 Avril 2007 à 21h18
Quote Post


Ouf
*

Groupe : Membre
Messages : 360


pas étonnant, tu travailles sur des nombre à 5 octets donc 40 bits

QUOTE
La taille des entiers dépend de la plate-forme de support, mais la valeur maximale est généralement de 2 milliards et des poussières (c'est un entier signé de 32 bits). PHP ne supporte pas les entiers non signés.
(source)

Même si d'après la doc il devrait convertir ce nombre en flottant. Enfin m'étonne qu'à moitié, le support des gros nombres est un peu bancal en php.

Si tu veux éviter les problèmes, utilise une lib comme GMP ou BCMath, ou alors stockes tes nombres dans une chaîne laugh.gif


--------------------
PMEmail Poster
Top
naholyr
Ecrit le : Lundi 02 Avril 2007 à 21h27
Quote Post


Ouf
*

Groupe : Membre
Messages : 423


Tout simplement parce que je suis un imbécile wink.gif
Ce n'est pas avec des 0 qu'il faut remplir ! C'est avec des caractères de code ascii 0 évidemment sad.gif
Je me suis rendu compte de ça grâce à "echo chr(0x30)" tongue.gif

Donc dans l'appel à str_pad() il faut remplir avec des chr(0) et pas des '0'
PMEmail PosterUsers WebsiteICQYahoo
Top
« Sujets + anciens | Programmer | Sujets + récents »

Reply to this topicStart new topicStart Poll