IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Comportement chaotique BigIndian LittleIndian sur un Word ? [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut Comportement chaotique BigIndian LittleIndian sur un Word ?
    Bonjour à tous.

    On reste dans les bitmaps pour changer Après le format XPM c'est à mon tour, de passer le format BMP à la moulinette.

    Un petit test tout bête (ma fonction pour vérifier le bouzin)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    Const
     BMP_MAGIC_WINBMP = $424D; //19778; //// --->  Là Paf les octets sont inversé si on défini en Hexa Pourquoi (cf test " if (bfType= BMP_MAGIC_WINBMP) " plus bas) ????
     
    function TGLZBitmapBMPImage.CheckFormat(): Boolean;
    Var
      S:String;
    begin
      Result := False;
     
      Memory.Read(FBmpFileHeader,SizeOf(TGLZBMPFileHeader));
      FHeaderSize:=Memory.ReadInteger;
      S:='';
      S:='Taille Header : '+InttoStr(SizeOf(TGLZBMPFileHeader))+#13+#10;
      S:=S+'MagicID : '+char(lo(FBmpFileHeader.bfType))+char(hi(FBmpFileHeader.bfType))+#13+#10;
      S:=S+'Taille : '+inttostr(FBmpFileHeader.bfSize)+#13+#10;
      S:=S+'Position données : '+inttostr(FBmpFileHeader.bfOffBits)+#13+#10;
      S:=S+'Taille 2eme Header : '+inttostr(FHeaderSize)+#13+#10;
      ShowMessage('CheckFormat'+#13+#10+S);
     
      With FBmpFileHeader do
      begin
        if (bfType= BMP_MAGIC_WINBMP)  or // C'est la le truc bizarre
               (bfType = BMP_MAGIC_OS2BMP)  or
               (bfType = BMP_MAGIC_OS21ICO) or
               (bfType = BMP_MAGIC_OS21CUR) or
               (bfType = BMP_MAGIC_OS22ICO) or
               (bfType = BMP_MAGIC_OS22CUR) then
           begin
              ShowMessage('BMP VALIDE');
              Result:= ReadImageProperties; // On Lit les propriétes de l'image
           end
           else ShowMessage('BMP INVALIDE');
      end;
    end;
    Voila le showMessage et on voit bien que les infos sont correctes.

    Nom : 2017-05-02_155411.jpg
Affichages : 195
Taille : 11,1 Ko

    Est ce que quelqu'un pourrais m'expliquer ce "swappage de byte" lors du test avec IF ?. Aurais-je une option de compilations cachée ou bien ?
    Par compte si je définie BMP_MAGIC_WINBMP en décimale (19778) pas de soucis ça fonctionne

    Si vous avez des idées, parce que je suis à sec. Et faut que je trouve avant de pouvoir avancer plus loin.

    Merci
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 937
    Billets dans le blog
    6
    Par défaut
    Comment te dire ? $424D = 16973... c'est toi qui as fait le swap !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Comment te dire ? $424D = 16973... c'est toi qui as fait le swap !
    Bon ok j'avais pas vérifié la valeur 19778 mais la question reste la même pourquoi IF bfType= = $424D = BM ça ne passe pas pourquoi ? est-ce ma constante qui est "swappée" ou ma variable bfType car dans le fichier c'est bien $424D. Mon showmessage m'affiche bien" BM" le lo c'est bien à gauche et hi à droite non ? c'est parce que je suis sous Windows ? Y'a franchement quelque chose qui m'échappe.

    vous pouvez tester plus simplement aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Const
     BMP_MAGIC_WINBMP = $424D;   //passe pas = 4D42 ça passe 
    var                     
      fs: TFileStream;
      sw : word;
    begin
     
      if OpenPictureDialog.Execute then
      begin
        fs:=TFileStream.Create(OpenPictureDialog.FileName, fmOpenRead + fmShareDenyNone);
        sw:=fs.ReadWord;
        ShowMessage('Stream Magic ID : '+char(lo(sw ))+char(hi(sw )));
        if sw=BMP_MAGIC_WINBMP then showMessage('Ok') else showMessage(' NOk');   
    end;
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  4. #4
    Membre émérite
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    457
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 457
    Par défaut
    Bonjour,

    Selon moi, c'est parce que tu es sur une architecture intel (en little endian) et c'est donc ta constante hexadécimale qui est inversée.

    est enregistré en inversant les octets en mémoire car ton compilateur considère que c'est un mot de 16 bits (16973) alors que le fichier lui est lu dans l'ordre des octets.
    Tu compares alors 'BM' avec 'MB' alors que lorsque tu mets ta constante à Les octets étant inversés tu compares bien 'BM' avec 'BM' même si tu as l'impression de l'inverse.

    Cordialement

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 937
    Billets dans le blog
    6
    Par défaut
    Lo renvoie l'octet de poids faible, qui devrait être $4D ('M') s'il n'y avait le souci que l'en-tête est lue comme un Word, stocké en interne en Little-Endian (donc avec l'octet de poids faible en tête), et non comme une suite de 2 caractères ou octets, au format Big-Endian (poids fort en tête), dans le fichier.

    stockage dans le fichier : BM

    zone mémoire de la variable Word lue d'après le fichier : BM

    valeur stockée dans cette variable Word : MB

    Lo(valeur) Hi(valeur) renvoie : BM

    Pour des décodeurs JPEG/EXIF, je faisais un swap des octets pour m'affranchir de ces problèmes, en lisant les variables une à une. Le problème ici est de lire d'un coup une structure.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Lo renvoie l'octet de poids faible, qui devrait être $4D ('M') s'il n'y avait le souci que l'en-tête est lue comme un Word, stocké en interne en Little-Endian (donc avec l'octet de poids faible en tête), et non comme une suite de 2 caractères ou octets, au format Big-Endian (poids fort en tête), dans le fichier.

    stockage dans le fichier : BM

    zone mémoire de la variable Word lue d'après le fichier : BM

    valeur stockée dans cette variable Word : MB

    Lo(valeur) Hi(valeur) renvoie : BM

    Pour des décodeurs JPEG/EXIF, je faisais un swap des octets pour m'affranchir de ces problèmes, en lisant les variables une à une. Le problème ici est de lire d'un coup une structure.
    Quand tu m'as dit "Comment te dire ? $424D = 16973... c'est toi qui as fait le swap !" c'est là que j'ai pigé plus ou moins.

    Citation Envoyé par acaumes Voir le message
    Bonjour,

    Selon moi, c'est parce que tu es sur une architecture intel (en little endian) et c'est donc ta constante hexadécimale qui est inversée.

    est enregistré en inversant les octets en mémoire car ton compilateur considère que c'est un mot de 16 bits (16973) alors que le fichier lui est lu dans l'ordre des octets.
    Tu compares alors 'BM' avec 'MB' alors que lorsque tu mets ta constante à Les octets étant inversés tu compares bien 'BM' avec 'BM' même si tu as l'impression de l'inverse.

    Cordialement
    Donc je résume, si j'ai bien compris je lis bien Bm et c'est bien BM dans ma variable. Mais vu que je suis sous Intel (et pas motorola ou dans le genre si je me souviens bien) c'est ma constante qui est stockée en mémoire avec les octets inversés. Question subsidiaire sous Linux c'est la même chose on dépend uniquement de l'architecture ? Car du coup mon code ne serait plus portable.
    Je vais peut-être déclarer ma variable comme le post n°49 que j'ai trouvé sur le forum de free pascal a cette adresse http://free-pascal-general.1045716.n...td2824951.html

    Merci encore et bonne fin de soirée


    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  7. #7
    Membre émérite
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    457
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 457
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Je vais peut-être déclarer ma variable comme le post n°49 que j'ai trouvé sur le forum de free pascal a cette adresse http://free-pascal-general.1045716.n...td2824951.html
    Ou comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {$ifdef ENDIAN_LITTLE}
     BMP_MAGIC_WINBMP = $4D42;
    {$else}
     BMP_MAGIC_WINBMP = $424D;
    {$endif}
    ENDIAN_LITTLE et INDIAN_BIG sont pré-définis par FPC selon l'architecture

    Cordialement

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Salut salut,

    moi j'utilise ça, honteusement pillé sur un site je sais plus où...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        amt := 0; Alongint := 0;  AWord := 0;  AChar := #0; // happy compilo
        AssignFile(f, opd.FileName);
        Reset(f, 1);
        idstr := '';
     
        {a bitmap file starts with the id 'BM'}
        BlockRead(f, AChar, 1, amt);
        idstr := AChar;
        BlockRead(f, Achar, 1, amt);
        idstr := idstr + AChar;
        If idstr <> 'BM' then begin
          MessageDlg('The file is not a valid bitmap', mterror, [mbok],0);
          CloseFile(f);
          Exit;
        end;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comportement ASP.Net/VB.Net et Word sur Serveur IIS7
    Par Franck.H dans le forum ASP.NET
    Réponses: 14
    Dernier message: 19/10/2016, 16h22
  2. Retour d'expérience sur conversion word ==> lyx
    Par Mathias2008 dans le forum Mise en forme
    Réponses: 12
    Dernier message: 07/04/2008, 19h09
  3. Caractère étrange sur récupération word
    Par jbrasselet dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 19/06/2007, 11h17
  4. aide sur Microsoft Word Object Laibrary
    Par salrouge dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/05/2007, 10h09
  5. Réponses: 16
    Dernier message: 08/03/2007, 17h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo