Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2180 connectés 

  FORUM HardWare.fr
  Programmation

  Little/Big Endian : programmation d'un module C ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Little/Big Endian : programmation d'un module C ?

n°20529
WhitePoney
Moi ! Moi m'sieur !
Posté le 26-03-2001 à 16:56:06  profilanswer
 

Je suis confronté au pbs little/big endians. Un ami m'a dit que programmer une fonction qui permet la convertion tient en 10 lignes. Ca m'embète d'utiliser une librairie, c'est chiant et pleins de conflits. Je vais donc essayer de programmer cette fonction de convertion 'à la main'.  
J'attends vos conseils !!
 
Bye !


---------------
>>> www.gamewarp.net <<< Toute l'actualité du jeu vidéo au quotidien :) >>> www.generateur35.com <<< Tous les générateurs du Web :D
mood
Publicité
Posté le 26-03-2001 à 16:56:06  profilanswer
 

n°20543
zop
1 world, 1 web, 1 Windows
Posté le 26-03-2001 à 17:23:15  profilanswer
 

J'aime bien gunm aussi
 
peut-être en assembleur ???

n°20552
JPA
Posté le 26-03-2001 à 17:54:32  profilanswer
 

J'avoue ne pas voir quel est ton problème !
Peux tu préciser ?
 
Si c'est un  pb d'affichage, l'échange de 2 octets prendra moins de 10 lignes...

n°20556
gilou2
Posté le 26-03-2001 à 18:08:00  profilanswer
 

/* Convertion little endian<-->big endian */
bswap(char *dst, char *dst, int n)
{
 int i,j;
 for(i = 0, j = n - 1; i < n; i++, j--)
  dst[i] = src[j];
}
 
int a;
int b;
 
bswap(&a, &b, sizeof(a));
 
A toi d'optimiser maintenant que tu sait ce que c'est.


---------------
Développeur de FreeVCR : http://freevcr.ifrance.com [:gilou2]
n°20559
gilou2
Posté le 26-03-2001 à 18:09:49  profilanswer
 

Si tu es sur un processeur intel, tu peux faire ça :
 
int a;
 
_asm
{
 mov eax, a
 bswap eax
}
 
ça swap les octets de poids fort et poids faible.

 

[edit]--Message édité par gilou2--[/edit]


---------------
Développeur de FreeVCR : http://freevcr.ifrance.com [:gilou2]
n°20599
MC
retour à la raison
Posté le 26-03-2001 à 21:42:39  profilanswer
 

Juste besoin d'une macro avec des shifts et des OU pour masquer:
 
#define bswap32(x) (((x) & 0xFF000000) >> 24 || ((x) & 0x00FF0000 >> 8 || ((x & 0x0000FF00) << 8) || ((x) & 0x000000FF << 24))
 
Le même chose pour 16 bits.
 
Effectivement t'as aussi d'autres moyens avec de l'asm direct sur pas mal de proc (nottament les intels, car ce sont eux qui sont petit endien). Mais c'est pas portable. Si c'est pour un pb de reseaux (big endian) généralement on fait des macro HOST2NET et NET2HOST, definies differement selon l'endianess de l'host.

n°20621
Gardien
Posté le 27-03-2001 à 00:24:15  profilanswer
 

euh si tu programmes ca en C, je dirais juste que c'est pas en réinventant la roue à chake fois ke tu dois coder un truc que tu vas etre efficace ...
 
Enfin, si cela t'amuses de programmer ca, j'ai rien dit.

n°20641
WhitePoney
Moi ! Moi m'sieur !
Posté le 27-03-2001 à 08:57:50  profilanswer
 

ouaou tout ça comme réponses ?!
gilou2 : je pensais à un truc similaire à celui que tu proposes en premier :
 
void a_convertion_LBE(char* ptr,int taille){
 
 char tmp [100];
 int i;
 
 /* on parcours la zone mémoire tout en sauvegardant */
 for (i=taille;i>=0;i--){
  tmp[i-1]=*ptr++;
 }
 memcpy(ptr,tmp,taille);
}
 
Mais bon ça marche pas encore. Sais pas si il vaut mieux récupérer en char * ou int *, vais voir. C'est pas propre mais là n'est pas le problème.
 
MC : ta solution à l'air bien sympa mais je comprends pas totalement ce que tu a écris mais je vais y réfléchir. Tu peux me dire à quoi correspond le 24/ le 8 ? Tu fais un décalage des octets c'est ça ?
 
 
JPA : oui c'est juste un décalage des octets que je veux faire.
 
Je bosses sur intel et transmissions réseau pour unix.
 
 
Merci :jap: !

n°20672
MC
retour à la raison
Posté le 27-03-2001 à 10:55:28  profilanswer
 

Euh si tu fais la conversion sur un gros espace de donnée comme ca tu vas te retrouver avec tes données dans le mauvais ordre (mais le bon endianess). Il faut que tu le fasse sur chaque donnée 16 et 32 bits, d'ou l'interet de l'assembleur pour optimiser. L'idée de la macro c'est juste de swapper les octets par decalage et masque (le LSB devient le MSB). C'est globalement plus efficace qu'une boucle (surtout sur un proc recent qui n'aime pas les boucles courtes).
 
Je programme en embedded (routeurs), on a des .h qui definissent des macros qui pointent vers les fonctions soit en C soit en assembleur (en fait de l'assembleur en ligne) selon la plateforme que l'on utilise (on fait la transition de big a little endian et on change de proc en plus). Tu n'as qu'a t'en faire un le plus portable possible comme ca tu n'as pas a te soucier du portage ni d'eventuelle librairies (surtout pour un truc aussi trivial que ca).

n°20759
gilou2
Posté le 27-03-2001 à 15:28:13  profilanswer
 

MC> Dans ta macro il faut remplacer les "||" par "|".


---------------
Développeur de FreeVCR : http://freevcr.ifrance.com [:gilou2]

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  Little/Big Endian : programmation d'un module C ?

 

Sujets relatifs
programmation C lecture ou stockage de fichier ?programmation en FLASH
COMMENT PASSER D'UN T-EDIT A UN AUTRE PAR PROGRAMMATION SOUS C++Programmation sous Delphi
programmation en assemblage sur motorola68000 sur ti92+Programmation réseau...
Programmation du port série avec Borland C++ Builder !!!programmation systéme sous linux
[ASP] Big Probleme (serieux)[C/C++ opengl] Programmation d'un jeu réseau
Plus de sujets relatifs à : Little/Big Endian : programmation d'un module C ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR