inverser l'endianness d'une valeur [Forums - Langage C]
inverser l'endianness d'une valeur [Forums - Langage C]
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
Recherche
 
   
 

Parcourir ce sujet :   1 Utilisateur(s) anonymes





inverser l'endianness d'une valeur
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1943
Hors Ligne
Bonjour

J'utilise un Kinetis (qui est Little endian comme tous les kinetis, pour info les S08 sont Big endian)
pour faire du modbus
je reçois dans un tableau la valeur 50000 en unsigned int 32bit soit dans l'ordre 4 octets 0, 0 C3 et 50
si je remplis ma valeur en lisant le tableau ainsi
u32Valeur = *(uint32_t*)&au8tableau[3] ; //valeur à partir du 4eme octet
j'obtiens u32Valeur = 1354956800 soit 50,C3,0,0 ce qui est logique puisque le MODBUS est Big endian.

La question : comment remplir u32Valeur simplement en lisant mon tableau ?
ou alors , comment inverser l'ordre des octets de u32Valeur ?

Le problème est surement classique, il y a donc surement des syntaxes efficaces pour faire ça...

Merci par avance

Posté le : 10/09/2016 17:01
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: inverser l'endianness d'une valeur
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Je ne sais pas avec quel système tu travaille, mais c'est un problème récurrent en réseau. Du coup posix prévoit http://linux.die.net/man/3/htons qui remettent systématiquement les octets dans le bon sens quel que soit l'endianness du processeur

Sinon, toujours avec posix, il existe ces fonctions

Au pire, tu déplaces un à un les octets dans le tableau.

Posté le : 10/09/2016 18:32
Transférer la contribution vers d'autres applications Transférer


Re: inverser l'endianness d'une valeur
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1943
Hors Ligne
Bonjour Jacques

Je ne suis pas sous unix mais sous FreeRtos

je cherchais en ANSI C mais je ne pensais pas à Freertos or il semblerait qu'il y ait quelquechose qui ressemble fort à ce que tu me suggères
http://www.freertos.org/FreeRTOS-Plus ... ns_ntohs_htonl_ntohl.html
je regarde

Merci

Posté le : 10/09/2016 18:57
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: inverser l'endianness d'une valeur
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1943
Hors Ligne
yess

Grâce au nom de ces fonctions je suis tombé sur des macros de freescale dans le SDK de KDS.

//Swap a 16-bit integer
#define _SWAP16(x) ( \
(((x) & 0x00FF) << 8) | \
(((x) & 0xFF00) >> 8))

//Swap a 32-bit integer
#define _SWAP32(x) ( \
(((x) & 0x000000FFUL) << 24) | \
(((x) & 0x0000FF00UL) << 8) | \
(((x) & 0x00FF0000UL) >> 8) | \
(((x) & 0xFF000000UL) >> 24))

//Swap a 64-bit integer
#define _SWAP64(x) ( \
(((x) & 0x00000000000000FFULL) << 56) | \
(((x) & 0x000000000000FF00ULL) << 40) | \
(((x) & 0x0000000000FF0000ULL) << 24) | \
(((x) & 0x00000000FF000000ULL) << 8) | \
(((x) & 0x000000FF00000000ULL) >> 8) | \
(((x) & 0x0000FF0000000000ULL) >> 24) | \
(((x) & 0x00FF000000000000ULL) >> 40) | \
(((x) & 0xFF00000000000000ULL) >> 56))

Il y a la même chose pour charger directement à la bonne valeur, mais là avec mon pointeur sur un tableau ça ne fonctionne pas.

merci

Posté le : 10/09/2016 19:41
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer



 Haut   Précédent   Suivant



Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

inverser l'endianness d'une valeur [Forums - Langage C]