magicsmacks
Messages postés128Date d'inscriptionmercredi 21 mai 2003StatutMembreDernière intervention 8 avril 2008
-
6 mars 2008 à 23:13
magicsmacks
Messages postés128Date d'inscriptionmercredi 21 mai 2003StatutMembreDernière intervention 8 avril 2008
-
8 avril 2008 à 23:15
Bonjour,
Voilà je dois décoder un fichier comprenant une liste de coordonnées de points, puis je voudrais après l'afficher sur un graph en php.
Pour l'affichage pas de pb je gère, simplement le décodage m'embète un peu.
Voici l'une des lignes :
æaaaa«â-ãmæ½è®è•çÓå16;å’æ~è™êïë1A;ê—ç çwè å Å É ‰ Ÿ » §
Je dois décoder cette ligne sachant qu'on me dit que ca représenterait sous la forme 32bits les valeurs 'integer' du signal.
Pourriez-vous m'indiquer comment décoder ceci?
Merci de votre aide
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 7 mars 2008 à 00:07
salut
tout les 4 octets, t'as une valeur, la fonction ord te donne la valeur d'un octet. apres, faut voir en fonction de l'endian, mais ca donnerait un truc genre :
les 8, 16 et 24 sont peut-etre dans le mauvais ordre...
/**
* @author coucou747 <coucou747@hotmail.com>
* @see irc://cominweb.uni-irc.net/#programmation
*/
magicsmacks
Messages postés128Date d'inscriptionmercredi 21 mai 2003StatutMembreDernière intervention 8 avril 2008 7 mars 2008 à 07:47
Bonjour, merci bcp pour cette réponse
Je viens de relire la notice de ce format en fait je me suis trompé c'est du 16 bits et donc sur 2 octets, est-ce que ca marcherai quand même en adaptant ainsi : ?
$t=array();
$strlen=strlen($s);
for ($i=0;$i<$strlen;$i+=2){
$t[]= ord($s[$i])+ord($s[$i+1]) << 8 ;
}
Je n'ai pas bien compris à quoi correspondait la dernière ligne de code?
Merci de votre aide précieuse
magicsmacks
Messages postés128Date d'inscriptionmercredi 21 mai 2003StatutMembreDernière intervention 8 avril 2008 22 mars 2008 à 08:43
Alors en fait ca fonctionne mais uniquement pour les nombres positifs. En fait j'avais oublié de dire que c'étaient des valeurs "signées" ce qui explique pourquoi les valeurs négatives ne sont pas correctes.
Savez-vous comment faire pour avoir des valeurs signées?
Merci de votre aide
magicsmacks
Messages postés128Date d'inscriptionmercredi 21 mai 2003StatutMembreDernière intervention 8 avril 2008 22 mars 2008 à 15:00
Bonjour,
Merci pour cette réponse...
Malheureusement tout ne fonctionne pas encore mais ca va mieux...
J'ai essayé avec cette méthode, mais les valeurs n'étaient toujours pas signées, j'ai donc modifié ce dernier code par celui-ci :
$nbr= ord($s[$i])+ord($s[$i+1]) << 8 ;
if ($nbr & 0x8000){
$nbr= $nbr - 0x010000;
}
$t[]=$nbr;
Simplement voilà, beaucoup de valeurs correspondent bien à ce que je devrais obtenir mais pas tout...
Par exemple lorsque je décode cette chaine de caractère : "ÿ?" le programme me renvoit : "16383", ce qui est la valeur que j'attends donc tout va bien.
Mais quand je décode : " À" il me renvoit "-16352" au lieu de "-16384"
De même quand je décode : " î" il me renvoit "-4576" au lieu de "-4608"
J'ai l'impression que le bug ce produit à chaque fois qu'il y a un espace à décoder et qu'il oublie de retrancher 32...
Où se trouve le problème selon vous?
Merci pour tout
magicsmacks
Messages postés128Date d'inscriptionmercredi 21 mai 2003StatutMembreDernière intervention 8 avril 2008 22 mars 2008 à 15:35
Rebonjour,
J'ai donc essayé d'adapter mon code par celui-ci :
for ($i=0;$i<$strlen;$i+=2){
$a = $a + 1;
$nbr= ((ord($chaine[$i]))+(ord($chaine[$i+1]) << 8)) ;
if ($nbr & 0x8000){
if ((ord($chaine[$i])) == '32') { $nbr= ((ord($chaine[$i+1]) << 8)) ; }
$nbr= $nbr - 0x010000;
}
Ce qui me permettait de corriger les autres problèmes...
Mais alors maintenant certaines valeurs sont toujours anormales :
La chaîne suivante : " è" est décodée par "-6144" au lieu de "-6112" soit une erreur de 32 encore.
Evidemment avec l'ancien code elle était décodée normallement...
Je ne comprends plus rien.
Merci de votre aide
magicsmacks
Messages postés128Date d'inscriptionmercredi 21 mai 2003StatutMembreDernière intervention 8 avril 2008 24 mars 2008 à 12:30
Merci beaucoup,
Effectivement ça rejoint ce que j'avais écrit mais comme je l'avais dit il existe toujours une erreur de 32 pour certaines chaînes.
En fait je pense que le php ne fait pas la différence entre un espace et l'absence de caractère. Ce qui explique que certaines chaînes commençant par " " donnent une bonne valeur alors que d'autres donnent une erreur de 32.
J'ai essayé d'ouvrir le fichier en "binaire" mais ca ne change rien.
Voyez-vous comment faire pour que le php fasse la différence entre ces 2 codages...? Existe-t-il un moyen d'ouvrir le fichier autrement
magicsmacks
Messages postés128Date d'inscriptionmercredi 21 mai 2003StatutMembreDernière intervention 8 avril 2008 24 mars 2008 à 14:21
J'avais essayé ca, mais ca ne marche pas car visiblement php ne fait pas la différence entre l'octet codé 32 et celui codé 0.
Donc pour certaines valeurs ca marchera mais pas pour tout
Mais je ne vois pas comment il serait possible de faire la différence avec un script php entre ces 2 octets...
Avez-vous une idée?
Merci pour tout
magicsmacks
Messages postés128Date d'inscriptionmercredi 21 mai 2003StatutMembreDernière intervention 8 avril 2008 8 avril 2008 à 23:15
En fait j'ai enfin trouver la réponse. En fait c'est de ma faute j'avais initialement ouvert le fichier que je voulais lire avec un fichier texte qui lui ne fait pas la différence entre ces 2 octets alors que le php oui...
Donc si vous rencontrez le même soucis que moi ne vous fier pas à l'affichage que peut vous renvoyer un fichier texte...
Encore mci pour ton aide précieus "coucou747".