Problème de conversion byte[] en int [Résolu]

Messages postés
17
Date d'inscription
jeudi 30 juillet 2009
Dernière intervention
3 juillet 2009
- 26 avril 2005 à 14:18 - Dernière réponse :
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Dernière intervention
16 juin 2010
- 28 avril 2005 à 00:57
Bonjour,

j'ai un probleme de conversion



j'utilise une liaison serie pour communiquer avec un instrument qui me
renvoie des tableaux de bytes... (enfin je lit des tableaus de
Byte sur le liaison)

J'ai besoin de recuperer des informations de ces tableaux et pource
j'aimerai convertir 2bytes en short ou 4bytes en int ????.

Voila ce que je recoit : example:

byte Tab[] = {0x07, 0xD4}



Et je veux recupere :

short année = 2004



Je suis en train de developper une interface pour cet instrument et j'utilise Visual C++ .NET

Je n'ai pas troué de foction qui realise ceci mais je me doute qu'ildoit exister un moyen simple de faire ceci.



Si quelqu'un a compris quelque chose a mon problème mercei de m'aider ...
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Dernière intervention
3 juillet 2006
27 avril 2005 à 12:42
3
Merci
byte TAB[10] = {0xBB, 0xA5,..., 0xD5, 0x07,...}

short val = *((short*)(&TAB[0]));
short val = *((short*)(&TAB[2]));
...

Merci ymca2003 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de ymca2003
Messages postés
17
Date d'inscription
jeudi 30 juillet 2009
Dernière intervention
3 juillet 2009
26 avril 2005 à 16:00
0
Merci
en fait j'ai resolu mon probleme en lisant directement le type que je veux ....

plus besoin de faire de conversion!!!!

Mais si quelqu'un a la solution qu'il ne se prive pas pour me la dnner....



merci
Commenter la réponse de Quemar
Messages postés
115
Date d'inscription
mardi 1 février 2005
Dernière intervention
8 octobre 2007
26 avril 2005 à 19:59
0
Merci
Desole mais je pense que c'est impossible de convertir un tableau de quelque chose

en une variable de n'importe quel type



Par contre tu peux aisement convertir un champ de ton tableau...
Commenter la réponse de cs_0xYg3n3
Messages postés
17
Date d'inscription
jeudi 30 juillet 2009
Dernière intervention
3 juillet 2009
27 avril 2005 à 11:56
0
Merci
en fait la methode que j'ai trouvé fonctionne mais j'ai ete obligé de l'abandonné car incompatible avec ce que je veux!!!!



j'aimerai que tu m'en dises plus sur ta solution....

je sais que l'on peut facilement convertir une valeur d'un tableau de byte en int par exemple



Mais moi ce que je veux c conveertir 2bytes (2*8bit) contenu ds un tableau de byte en un short

Parce que mes 2 bytes represente qu'une seule valeur de type short (16bit)...?????





-->> exemple de mon problème:

mon instrument via la liaison serie me revoie un tableau de byte:

byte TAB[10] = {0xBB, 0xA5,..., 0xD5, 0x07,...}



moi ce que je veux c 0xD5 et 0x07 qui est une année 07D5 = 2005

mais le probleme est que si je lit directement un short de la liaison
serie (SANS PASSER PAR LE TABLEAU CI DESSUS)(c la solution que j'avais
trouvé) je lit : D507 = 54355

et apres impossible d'en faire quoi que ce soit !!!!! OUBIEN



Donc je stock tout ds un tableau, je retourne (ca c facile!!!) et apres j'aimerai lire 2byte du tableau pour en faire un short.... mais ca c pas possible !!!!





Quelqu'un a t il une solution?
Commenter la réponse de Quemar
Messages postés
17
Date d'inscription
jeudi 30 juillet 2009
Dernière intervention
3 juillet 2009
27 avril 2005 à 12:17
0
Merci
cbon plus de prob

ma solution precedente marche tres bien



dosole me suis trompe!!!



merci
Commenter la réponse de Quemar
Messages postés
17
Date d'inscription
jeudi 30 juillet 2009
Dernière intervention
3 juillet 2009
27 avril 2005 à 17:16
0
Merci
Je ne comprend pas ce tout petit code !!!!!



mais ca marche (il faut juste que je declare un unsigned short mais sinon)

si t'as le temps de m'eclairer et de m'expliquer !!!!

je suis pas un dieu du C !!!



merci
Commenter la réponse de Quemar
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Dernière intervention
3 juillet 2006
27 avril 2005 à 18:03
0
Merci
Dans la mémoire, toutes les variables sont constituées d'une suite d'octet. un BYTE 1 octet, un WORD 2 octets et 1 DWORD 4 octets. Les octets sont stockés poids faible en tête (little endian)
exemple :int val 0x12345678;> en mémoire tu trouvera les octets :
0x78 0x56 0x34 0x12

maintenat si tu as un pointeur sur le premire octet de cette zone, tu peux y lire soit 1, 2 ou 4 octets directement dans une variable BYTE, WORD ou DWORD grace au little endian.
pour cela il fuat convertir le pointeur sur l'octet en un pointeur sur le type de la varaible et de récupéréer la valeur.

Exemple :

// suite d'octet en mémoire
BYTE TAB[10] = {0xBB, 0xA5,..., 0xD5, 0x07,...}

// pointeur sur le 2 ème octet de cette suite
BYTE* pb = &TAB[10];

// transformation en un pointeur sur WORD (même adresses mais permet de lire 2 octet)s
WORD* pw = (WORD*)pb;

// récupération de la valeur
WORD w = *pw;
Commenter la réponse de ymca2003
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Dernière intervention
16 juin 2010
28 avril 2005 à 00:57
0
Merci
c'est la qu'on voir l'avantage de l'asm, pas besoin de pointeurs, un
simple décalage de bits et c'est ok... mais le débat n'est pas la.
pas
mal ton code, ymca, mais je doute que ce soit la meine de compliquer
les choses avec le big/little endian et le poids des bits...encore une
fois le débat n'est pas la

ok je sors ^^

++
_______________________


Omnia vincit labor improbus
Commenter la réponse de Arnaud16022

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.