Problème de conversion byte[] en int

Résolu
Quemar Messages postés 17 Date d'inscription jeudi 30 juillet 2009 Statut Membre Dernière intervention 3 juillet 2009 - 26 avril 2005 à 14:18
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre 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 ...
A voir également:

8 réponses

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

short val = *((short*)(&TAB[0]));
short val = *((short*)(&TAB[2]));
...
3
Quemar Messages postés 17 Date d'inscription jeudi 30 juillet 2009 Statut Membre Dernière intervention 3 juillet 2009
26 avril 2005 à 16:00
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
0
cs_0xYg3n3 Messages postés 115 Date d'inscription mardi 1 février 2005 Statut Membre Dernière intervention 8 octobre 2007
26 avril 2005 à 19:59
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...
0
Quemar Messages postés 17 Date d'inscription jeudi 30 juillet 2009 Statut Membre Dernière intervention 3 juillet 2009
27 avril 2005 à 11:56
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?
0

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

Posez votre question
Quemar Messages postés 17 Date d'inscription jeudi 30 juillet 2009 Statut Membre Dernière intervention 3 juillet 2009
27 avril 2005 à 12:17
cbon plus de prob

ma solution precedente marche tres bien



dosole me suis trompe!!!



merci
0
Quemar Messages postés 17 Date d'inscription jeudi 30 juillet 2009 Statut Membre Dernière intervention 3 juillet 2009
27 avril 2005 à 17:16
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
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
27 avril 2005 à 18:03
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;
0
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
28 avril 2005 à 00:57
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
0
Rejoignez-nous