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

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  [résolu] Lire un byte big endian

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[résolu] Lire un byte big endian

n°2021184
rengzehn
Posté le 04-09-2010 à 17:38:38  profilanswer
 

Bonjour,
Je travaille sur un fichier binaire non typé. j'ai les specs du fichier et certaines données sont en little endian d'autres en big. Pour le little ça marche bien avec ce genre d'instructions :
 

Code :
  1. AssignFile(f, Path);
  2. Reset(f, 1);
  3. Seek(f, 4);
  4. BlockRead(f,DBNRecords,sizeof(DBNRecords));


 
des que le champ est codé en big endian ma valeur, un integer, est bien affectée bien mais je ne sais pas quoi faire du contenu ?!? comment trouver le veritable integer à partir de celui que j'ai lu ?
 
Merci de vos reponses.


Message édité par rengzehn le 07-09-2010 à 12:31:32
mood
Publicité
Posté le 04-09-2010 à 17:38:38  profilanswer
 

n°2021186
theshockwa​ve
I work at a firm named Koslow
Posté le 04-09-2010 à 18:11:43  profilanswer
 

tu as des fonctions pour la conversion d'endianness entre normes réseau (big endian) et hôte (le pc sur lequel tu compiles ton programme)
 
ntoh (network to host) et hton (host to network) pour convertir des entiers
ntohs et htons pour convertir des short


---------------
last.fm
n°2021262
rengzehn
Posté le 05-09-2010 à 18:23:24  profilanswer
 

ça n'a pas fonctionné par contre avec cette fonction, ça marche :
 
 
function Swap32( aLong: Longint ): Longint; assembler;
asm
BSWAP eax
end;

n°2021539
theshockwa​ve
I work at a firm named Koslow
Posté le 07-09-2010 à 10:58:21  profilanswer
 

ignoble


---------------
last.fm
n°2021541
sligor
Posté le 07-09-2010 à 11:21:56  profilanswer
 

c'est clair :/


---------------
qwerty-fr
n°2021544
rengzehn
Posté le 07-09-2010 à 11:27:03  profilanswer
 

quoi qui est ignoble ? :D
j'avais juste besoin d'inverser les bits sur 32 bits. J'ai regardé du coté de ntoh... mais je n'ai rien compris à lo et hi et je crois que ça tape sur du 8 bit..
 
(j'avais testé les fonctions de ce site : http://www.koders.com/delphi/fidB4 [...] twork#L13)
 
et cette fonction
 

Code :
  1. function htons(i : Integer) : Integer;
  2. begin
  3.    htons := lo(i) shl 8 or hi(i);
  4. end;


 
marchait po


Message édité par rengzehn le 07-09-2010 à 11:29:36
n°2021547
sligor
Posté le 07-09-2010 à 11:34:03  profilanswer
 

htons avec 's' pour short aka 16bits, normal que ça ne marche pas


---------------
qwerty-fr
n°2021548
rengzehn
Posté le 07-09-2010 à 11:37:30  profilanswer
 

le type Integer en delphi est codé sur 32 bits donc la fonction est pas hyper claire  [:souk]

 

c'est quoi le prob d'utiliser  de l'assembleur ?


Message édité par rengzehn le 07-09-2010 à 11:44:45
n°2021549
sligor
Posté le 07-09-2010 à 11:40:52  profilanswer
 

c'est pas portable, ça dépends du cpu et de la convention d'appel du système.


---------------
qwerty-fr
n°2021554
rengzehn
Posté le 07-09-2010 à 11:44:49  profilanswer
 

Code :
  1. function hton(l : LongInt) : LongInt;
  2. begin
  3.    hton := (lo(lo(l)) shl 8 or hi(lo(l))) shl 16
  4.      or (lo(hi(l)) shl 8 or hi(hi(l)));
  5. end;
 

ne marche pas non plus

 

je ne sais pas si j'ai été clair dans ma question :
je travaille pas sur un reseau mais  un fichier binaire sur un disque. à un endroit il contient un Integer codé sur 4 bytes en bigendian que je veux récupérer.

 

je dois inverser TOUS les bits du longint


Message édité par rengzehn le 07-09-2010 à 12:04:49
mood
Publicité
Posté le 07-09-2010 à 11:44:49  profilanswer
 

n°2021575
rengzehn
Posté le 07-09-2010 à 12:31:17  profilanswer
 

Code :
  1. function Swap32(L : longint) : longint;
  2. begin
  3.   result := swap(L shr 16) or (longint(swap(L and $ffff)) shl 16);
  4. end;


 
vala, avec ça c'est bon...

n°2021595
theshockwa​ve
I work at a firm named Koslow
Posté le 07-09-2010 à 13:33:51  profilanswer
 

que tu sois en réseau ou pas, l'endianness est un point à prendre en compte pour permettre la communication entre différentes machines.
 
Réécrire ta propre fonction de swap te semble fonctionner, mais c'est faux. Il suffit que tu exécutes ton programme sur une machine big endian et il échouera nécessairement. il _faut_ passer par les fonctions exposées par ton langage et ses bibliothèques standard pour effectuer cette conversion, parce que c'est du ressort de l'implémentation de déterminer si, pour obtenir des entiers qui ont du sens à partir de données en big endian, il faut oui ou non faire le swap.
 
dans mon premier post, j'ai cru que tu étais en C ... En Delphi, je ne sais pas comment s'appellent ces fonctions, mais je ne pense pas que les recoder toi-même puisse être une bonne idée. Ces fonctions sont la base de ce que le langage doit te proposer, AMHA.
 
Edit : c'est flippant de chercfher sur google et de voir le nombre de personnes qui réécrivent ces fonctions de manière absolument pas portable en pensant avoir réolu le problème ...


Message édité par theshockwave le 07-09-2010 à 13:37:58

---------------
last.fm

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

  [résolu] Lire un byte big endian

 

Sujets relatifs
pouvoir lire une vidéo à la fois sur l'Ipad et sur l'ordinateuroracle utiliser la même table pour lire ....
Lire et écrire dans un fichier Excel avec un programme c++Lire fichier avec XML
[resolu]lire un attribut prive (poo)lire un fichier .mat en C
[xml/xsl] Je n'arrive pas à lire mes log de conversation msn[VBS] Lire un fichier excel
[VBA] lire fichier texte jusqu'à ...[java] probleme de transfert de tableau de byte
Plus de sujets relatifs à : [résolu] Lire un byte big endian


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