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

C# Discussion :

Histoire de Big Endian


Sujet :

C#

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Histoire de Big Endian
    Bonjour amigo developatores ( une espèce rare ! )

    Je suis en train de faire un petit soft qui échange par internet avec un serveur en Big Endian ... Le Big Endian est devenu depuis ce jour ma plus grande passion, comme dirait l'autre je kiff sa race !

    Non je rigole quel merde c'te truc, ça fait une semaine que je me bat contre cette chose que je ne sais même pas pourquoi l'a t'on inventé !

    Je me demandais si le Big Endian par rapport a une chaine en Little Endian :

    ABCDintEF (chaine ABCD = une chaine, EF = une chaine, int = un entier)
    --------> (sens de lecture)

    C'était plutôt :

    ABCDintEF
    <--------

    ce qui nous donne :

    FEtniDCBA
    -------->

    ou plutôt :

    ABCDintEF
    <---<--<-

    Ce qui nous donne :

    CDBAtniFE
    --------->

    Ce qui, vous comprendrez bien, n'est pas tous a fait la même chose.
    En vérité la réponse a cette question n'est pas la résolu de mes problèmes mais ce sera un bon début ^^.

    Merci d'avance.
    Sand-Saref

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    La notion de big/little endian concerne la représentation binaire des données en mémoire. En big endian, l'octet de poids fort d'une entité se trouve en premier, alors qu'en little endian c'est l'octet de poids faible qui se trouve en premier. Par exemple, si on prend l'entier sur 16 bits 1024 (soit 0x0400 en hexa), sa représentation binaire en big endian sera [0x04, 0x00]. En little endian, ce sera [0x00, 0x04]. Par contre, quand tu as une chaine de caractères, les caractères sont traités comme des entités à part entière, donc ils restent dans leur ordre "naturel". La notion d'endianness ne concerne que l'ordre des octets au sein d'une entité (du moins dans son acceptation la plus courante).

    Donc en fait, si on reprend ton exemple (un peu trop schématique pour être juste, mais on va faire avec), si la représentation big endian est [ABCDintEF], alors en little endian ça donne [ABCDtniEF]

    La plupart des processeurs d'ordinateurs de bureau (x86/x64 par exemple) fonctionnent en little endian. En pratique, tu n'as habiuellement pas besoin de le savoir, sauf quand tu manipules manuellement des données binaires... Mais il faudrait que tu expliques un peu plus clairement ce que tu cherches à faire, parce que là c'est difficile de t'apporter une aide concrète avec les éléments que tu as donnés.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    C'est pas que je ne comprend pas vite ^^ C'est qu'il faut m'expliquer longtemps ...
    Tu as un jeune de 18 ans en face de toi qui programme a ses heures perdus ... Ne le prend pas mal mais si j'aurais voulu une explication comme la tienne, il suffisait que je branche wiki et puis j'avais mon explication ... Et a vrai dire je trouve cela un peu compliqué ...

    Si je suis la c'est que je suis un peu trop bête pour comprendre cela et je demande donc a se que l'on m'explique plus simplement. Ou sont les bonnes vieilles métaphores ?

    Pour faire concret, j'ai un soft qui échange des blah blah avec un serveur, celui ci est en Big Endian ( Actionscript ). Mon PC est en Little Endian ( C# ).
    Arrive un moment ou le serveur m'envoi un packet composé de plusieurs type d'entité ( int, short, ... etc ! ) précédé d'un id de packet et de la longueur des données.

    Je sais quand est-ce qu'il faut que je lise tel ou tel type d'entité.
    Jusqu'a maintenant je lisais le paquet petit a petit, cad comme si je lisais de la façon suivante :

    ABCDintEF (chaine ABCD = une chaine, EF = une chaine, int = un entier)
    <---<--<- ( sens de lecture )

    Ce qui nous donne :

    CDBAtniFE ( tni = int en Big Endian, CDBA = ABCD en Big Endian, FE = EF en Big Endian )
    --------->

    C'est a dire que je lisais un petit bout de mon flux que je "retournais" a l'aide de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    byte[] tempbuffer = new byte[buffer.Length];
     
                MemoryStream tempbufferstream = new MemoryStream(tempbuffer);
                BinaryReader tempbufferstreamreader = new BinaryReader(tempbufferstream);
     
                for (int i = buffer.Length - 1; i >= 0; i--)
                {
                    tempbuffer[i] = tempbufferstreamreader.ReadByte();
                }
     
                buffer = tempbuffer;
    Mais j'ai décidé de changer, car j'avais des difficultés dans l'écriture ...
    J'ai décidé de tout retourner d'un coup et ensuite de lire petit a petit dans le gros morceau préalablement retourné ...
    Comme ceci :

    ABCDintEF
    <--------

    ce qui nous donne :

    FEtniDCBA
    -------->

    Mais ça ne marche plus ...

    Alors je n'arrive pas a mettre concrètement le doigt sur mon erreur ... J'en ai une vague mais je n'arrive pas l'interpréter ...

    Pouvez-vous m'aider ? =D
    Merci d'avance !


    EDIT : Wooooh j'avais pas vu l'entre deux paragraphe ... Je n'imaginai pas cela comme ça ... Mais je crois que tu a répondu ...
    Je vais tester et te redirais si c'est bon.
    Mais pas tout de suite, avant y'a dodo =)

    Merci !

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Pour convertir un buffer de Big Endian vers little Endian ou inversement :
    - string ABCD => string ABCD (pas d'inversion)
    - entier sur un octet X => X (pas d'inversion),
    - entier sur 2 octets XY => YX,
    - entier sur 4 octets WXYZ => ZWXY.

    Fonctions d'inversion d'entiers (2 et 4 octets):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    internal short Invert(short i)
    {
       return (i & 0xFF) << 8 | (i && 0xFF00) >>8 ; 
    }
     
    internal int Invert(int i)
    {
       return (i & 0xFF) << 24 | (i && 0xFF00) << 8 | (i & 0xFF0000) >>8 | (i && 0xFF00000) >> 24 ; 
    }

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Bonjour

    Tu peux aussi utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IPAdress.HostToNetworkOrder(tonInt32);

Discussions similaires

  1. Conversion little vers big endian
    Par kris1980 dans le forum x86 32-bits / 64-bits
    Réponses: 8
    Dernier message: 16/08/2007, 13h42
  2. Pb avec "BIG ENDIAN"
    Par pdgnr dans le forum Delphi
    Réponses: 2
    Dernier message: 04/09/2006, 09h37
  3. Big endian et Little endian?
    Par moon93 dans le forum C
    Réponses: 4
    Dernier message: 07/05/2006, 22h48
  4. Cast et little/big endian
    Par progfou dans le forum C
    Réponses: 8
    Dernier message: 29/03/2006, 18h54
  5. Comment écrire en big endian dans un fichier ?
    Par j3d dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 24/07/2005, 21h50

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