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

Quemar 17 Messages postés jeudi 30 juillet 2009Date d'inscription 3 juillet 2009 Dernière intervention - 26 avril 2005 à 14:18 - Dernière réponse : Arnaud16022 1329 Messages postés vendredi 15 août 2003Date d'inscription 16 juin 2010 Dernière intervention
- 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 

8 réponses

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

short val = *((short*)(&TAB[0]));
short val = *((short*)(&TAB[2]));
...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ymca2003
Quemar 17 Messages postés jeudi 30 juillet 2009Date d'inscription 3 juillet 2009 Dernière intervention - 26 avril 2005 à 16:00
0
Utile
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
cs_0xYg3n3 115 Messages postés mardi 1 février 2005Date d'inscription 8 octobre 2007 Dernière intervention - 26 avril 2005 à 19:59
0
Utile
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
Quemar 17 Messages postés jeudi 30 juillet 2009Date d'inscription 3 juillet 2009 Dernière intervention - 27 avril 2005 à 11:56
0
Utile
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
Quemar 17 Messages postés jeudi 30 juillet 2009Date d'inscription 3 juillet 2009 Dernière intervention - 27 avril 2005 à 12:17
0
Utile
cbon plus de prob

ma solution precedente marche tres bien



dosole me suis trompe!!!



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