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

VB 6 et antérieur Discussion :

Comment écrire en big endian dans un fichier ?


Sujet :

VB 6 et antérieur

  1. #1
    j3d
    j3d est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Comment écrire en big endian dans un fichier ?
    bonjour,
    J'ai ouvert un fichier en mode binary, je veux y inscrire un nombre au format single. Mais je veux qu'il soit écrit dans le fichier en big endian et non en little endian. Existe-t-il une méthode, fonction, formule simple pour réaliser la conversion ?

  2. #2
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    je ne connais pas la reponse de ce probleme
    mais pour ma culture personnelle c'est quoi un "big endiant ou un small endiant"

    Cordialement Baxter

  3. #3
    Membre éclairé Avatar de sozie9372
    Inscrit en
    Mai 2005
    Messages
    713
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    Points : 724
    Points
    724
    Par défaut
    Salut !
    Format de stockage ou de transmission de données binaires dans lequel les informations les plus significatives ( octets ou bits ) sont stockées ou transmises en premier.
    Les processeurs Intel comme le Pentium utilisent ce format.
    Et inversement pour les little endian.

    En fait ce sont les bits de poids forts et les bits de poids faibles je crois ( )

    Pour ta question j3d, si j'ai bien compris, ton nombre tu veux qu'il soit écrit en binaire dans le fichier mais dans l'ordre inverse ? Parce que si c'est ca tu peux bidouiller vite fait un pti truc qui convertit ton chiffre en binaire, puis tu fais un StrReverse.
    Ou peut être me suis-je enflamé :
    +++
    Ju

  4. #4
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    ok merci pour ta reponse

    Cordialement baxter

  5. #5
    j3d
    j3d est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    j'ai tenté un truc mais doit certainement y avoir plus simple :
    cette fonction prend un single écrit en little endian en mémoire et renvoit ce meme single écrit en big endian. Je suis passé par une conversion en caractères via l'écriture dans un fichier, comme ça c'est plus simple pour les inverser ensuite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function SngLE2BE(ByRef nombre As Single) As Single
    Dim ByteStr As String * 1
    Dim SngStr As String * 4
    Open "filebuffer" For Binary As #1
    Put #1, , nombre
    For i = 1 To 4
        Get #1, i, ByteStr 'on chope le caractère correspondant à l'octet
        SngStr = ByteStr & SngStr 'ici on inverse la chaine
    Next i
    Put #1, 1, SngStr 'on réintroduit la chaine inversée dans le fichier
    Get #1, 1, SngLE2BE 'et on chope le single correspondant
    Close #1
    Kill "filebuffer"
    End Function

  6. #6
    j3d
    j3d est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Ma fonction est trop lente help !!
    Doit bien y avoir moyen de récupérer indépendamment les 4 octets d'un single sans passer par lécriture dans un fichier !

  7. #7
    Tan
    Tan est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 168
    Points : 158
    Points
    158
    Par défaut
    Il existe surement des fonctions toutes faites, mais je ne les connais pas.

    Mais sinon, tu n'as qu'à refaire le calcul de conversion d'un single vers un binaire (en 32bits - single), méthode de conversion d'un réél vers binaire

    Que tu ferai très légèrement différemment pour l'avoir en big indian.

  8. #8
    j3d
    j3d est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Merci, ça me permet d'avancer sur une bonne voie.
    Je n'arrive pas à généraliser le calcul pour convertir les single en binaire dans le cas ou on a des exposants de 10 exemple 3,14159E+24. Comment procède-t-on dans ce cas là ?

  9. #9
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Citation Envoyé par j3d
    Ma fonction est trop lente help !!
    Doit bien y avoir moyen de récupérer indépendamment les 4 octets d'un single sans passer par lécriture dans un fichier !
    ben tu le transforme en chaine de caractéres par la fonction Hex ... et ensuite les 4 caractéres représente tes 4 octects ....

  10. #10
    j3d
    j3d est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    non c'est pas aussi simple que ça, ça n'est valable que pour les entiers non signés. Pour les floats ils faut passer obligatoirement par une écriture en binaire (voir site cité ci-dessus).
    Cela dit, j'ai fini par mettre au point une fonction qui prend en entrée un single et qui renvoit la chaine équivalente écrite en big endian. Et c'est 12 fois plus rapide qu'en passant par l'écriture dans un fichier comme j'avais tenté précédemment.[/quote]

  11. #11
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 163
    Points : 173
    Points
    173
    Par défaut
    du temps que tu réponde, j'avais fait çà, alors je le mets quand même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        Dim mon_nombre As Double
        Dim le_resultat As Double
        Dim octet1 As Double
        Dim octet2 As Double
        Dim octet3 As Double
        Dim octet4 As Double
     
        mon_nombre = &HAABBCCDD
        octet1 = ((mon_nombre And &HFF000000) / (16 ^ 6)) And &HFF
        octet2 = ((mon_nombre And &HFF0000) / (16 ^ 2)) And &HFF00
        octet3 = (CDbl(mon_nombre * (16 ^ 2)) And &HFF0000)
        octet3 = (((mon_nombre And &HFF00) / (16 ^ 2)) And &HFF) * (16 ^ 4)
        octet4 = (mon_nombre And &HFF) * (16 ^ 6)
        le_resultat = octet1 + octet2 + octet3 + octet4
    je travail sur des doubles pour des problèmes de dépassement de capacité ...

  12. #12
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Citation Envoyé par j3d
    non c'est pas aussi simple que ça, ça n'est valable que pour les entiers non signés. Pour les floats ils faut passer obligatoirement par une écriture en binaire (voir site cité ci-dessus).
    Cela dit, j'ai fini par mettre au point une fonction qui prend en entrée un single et qui renvoit la chaine équivalente écrite en big endian. Et c'est 12 fois plus rapide qu'en passant par l'écriture dans un fichier comme j'avais tenté précédemment.
    [/quote]

    oui mais avec ta méthode d'écriture dans fichier tu ne faisait rien de plus qu'inverser les 4 octets... ce que je te proposait avec ma manib passant par Hex....

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/02/2010, 01h14
  2. Comment écrire sur une image, dans un cadre ?
    Par Nutrino dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 20/05/2005, 00h55
  3. Réponses: 5
    Dernier message: 16/03/2005, 22h17
  4. Réponses: 3
    Dernier message: 29/12/2004, 17h10
  5. Réponses: 10
    Dernier message: 16/12/2004, 15h23

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