Integer

Résolu
magicsmacks Messages postés 128 Date d'inscription mercredi 21 mai 2003 Statut Membre Dernière intervention 8 avril 2008 - 6 mars 2008 à 23:13
magicsmacks Messages postés 128 Date d'inscription mercredi 21 mai 2003 Statut Membre Derniè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

MAGICSMACKS[:p]

13 réponses

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
22 mars 2008 à 11:53
$nbr= ord($s[$i])+ord($s[$i+1]) << 8 ;

if ($nbr & 0x8000){
$nbr=0x010000 - $nbr;
}

$t[]=$nbr;
3
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
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 :

$s ta chaine

$t=array();
$strlen=strlen($s);
for ($i=0;$i<$strlen;$i+=4){
    $t[]= ord($s[$i])+ord($s[$i+1]) << 8 + ord($s[$i+2]) << 16 + ord($s[$i+3]) << 24;
}

les 8, 16 et 24 sont peut-etre dans le mauvais ordre...
/**
* @author coucou747 <coucou747@hotmail.com>
* @see irc://cominweb.uni-irc.net/#programmation
*/
0
magicsmacks Messages postés 128 Date d'inscription mercredi 21 mai 2003 Statut Membre Derniè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[:p]
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
7 mars 2008 à 14:06
ca devrait marcher.

regarde les operateurs binaires, et ce que fait la fonction ord (cf php.net )

/**
* @author coucou747 <coucou747@hotmail.com>
* @see irc://cominweb.uni-irc.net/#programmation
*/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
magicsmacks Messages postés 128 Date d'inscription mercredi 21 mai 2003 Statut Membre Derniè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[:p]
0
magicsmacks Messages postés 128 Date d'inscription mercredi 21 mai 2003 Statut Membre Derniè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[:p]
0
magicsmacks Messages postés 128 Date d'inscription mercredi 21 mai 2003 Statut Membre Derniè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[:p]
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
22 mars 2008 à 15:57
if ($nbr & 0x8000){ // si le bit de signe est a 1 alors c'est un negatif
$nbr=0x010000 - $nbr; // si c'est un negatif, alors


c'est la que je me suis plante :)

tu peux essayer :


$nbr= 0xFFFF0000 & $nbr;

ou

$nbr= - (0x010000 - $nbr);

}

a mon avis, les deux devraient fonctionner
0
magicsmacks Messages postés 128 Date d'inscription mercredi 21 mai 2003 Statut Membre Derniè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


Merci d'avance

MAGICSMACKS[:p]
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
24 mars 2008 à 12:44
salut

tu peux faire ca :

function cccc($c){
if ($c==' ') return 32;
else return ord($c);
}

$nbr= ((cccc($chaine[$i]))+(cccc($chaine[$i+1]) << 8)) ;
0
magicsmacks Messages postés 128 Date d'inscription mercredi 21 mai 2003 Statut Membre Derniè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[:p]
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
24 mars 2008 à 14:28
aucune, desole
0
magicsmacks Messages postés 128 Date d'inscription mercredi 21 mai 2003 Statut Membre Derniè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".

MAGICSMACKS[:p]
0
Rejoignez-nous