[résolu] Lire un byte big endian

Lire un byte big endian [résolu] - Delphi/Pascal - Programmation

Marsh Posté le 04-09-2010 à 17:38:38    

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
Reply

Marsh Posté le 04-09-2010 à 17:38:38   

Reply

Marsh Posté le 04-09-2010 à 18:11:43    

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
Reply

Marsh Posté le 05-09-2010 à 18:23:24    

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

Reply

Marsh Posté le 07-09-2010 à 10:58:21    

ignoble


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

Marsh Posté le 07-09-2010 à 11:21:56    

c'est clair :/


---------------
qwerty-fr
Reply

Marsh Posté le 07-09-2010 à 11:27:03    

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
Reply

Marsh Posté le 07-09-2010 à 11:34:03    

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


---------------
qwerty-fr
Reply

Marsh Posté le 07-09-2010 à 11:37:30    

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
Reply

Marsh Posté le 07-09-2010 à 11:40:52    

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


---------------
qwerty-fr
Reply

Marsh Posté le 07-09-2010 à 11:44:49    

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
Reply

Marsh Posté le 07-09-2010 à 11:44:49   

Reply

Marsh Posté le 07-09-2010 à 12:31:17    

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...

Reply

Marsh Posté le 07-09-2010 à 13:33:51    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed