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 :

prefixe de longueur pour string en integer 7 bits !


Sujet :

C#

  1. #1
    Membre expérimenté
    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
    Par défaut prefixe de longueur pour string en integer 7 bits !
    Bonjour

    Je voudrais utiliser un BinaryReader pour lire des strings mais j(aimerais savoir comment preparer ces strings dans un fichier

    Voici ce que dit la doc

    <u>Reads a string from the current stream. The string is prefixed with the length, encoded as an integer seven bits at a time</u>

    Cela signifie qu'un string ne peut pas depasser 127 caracteres (7 bits)
    Je suis un peu étonné ou je ne comprends pas bien ce que signifie cette information !

  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 : 43
    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
    Par défaut
    Tes strings sont dans un fichier binaire ? Sinon il vaut mieux utiliser un StreamReader...
    Pour le ReadString qui prend 127 caractères max, c'est bizarre en effet... ça suppose que les chaines ont été encodées de cette manière dans le fichier, ce qui n'est pas vraiment habituel il me semble... si tu connais à l'avance la longueur max de la chaîne, tu peux utiliser ReadChars et reconstituer la chaîne à partir du tableau de char.

    EDIT: en fait je crois que la longueur n'est pas réellement encodée sur 7 bits mais sur 32, selon une compression 7 bits (quoique je ne vois pas exactement ce qu'ils veulent dire par là).
    D'ailleurs il y a une fonction de BinaryReader qui est sans doute liée à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected internal int Read7BitEncodedInt()
    Reads in a 32-bit integer in compressed format.
    Par contre je ne vois pas trop comment écrire un fichier encodé comme ça, sans connaitre la façon de coder la longueur. La méthode BinaryWriter.WriteString n'existe pas, et BinaryWriter.Write7BitEncodedInt est protégée... donc il faudrait hériter de BinaryWriter et définir WriteString en utilisant Write7BitEncodedInt

  3. #3
    Membre expérimenté
    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
    Par défaut J'ai trouvé !
    La methode d'encodage de longueur est asser simple et dérivée d'UTF
    En fait, tant que la longueur dépasse 127 on ecrit un byte masqué avec 0x80

    J'avais essayer de mixer un binaryreader et un streamreader pour la lecture d'un michier mixte ca marche +/- sauf que streamreader fait une bufferisation différente que binaryreader et que je n'ai pas encore bien resolu l'interaction entre les deux dabs certaines situation.

    Pour ceux a qui ca peut etre utile !

    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
    protected void Write7BitEncodedInt(int value) {
    // Write out an int 7 bits at a time. The high bit of the byte,
    // when on, tells reader to continue reading more bytes.
    uint v = (uint) value; // support negative numbers
    while (v >= 0x80) {
    Write((byte) (v | 0x80));
    v >>= 7;
    }
    Write((byte)v);
    }
     
    protected int Read7BitEncodedInt() {
    // Read out an int 7 bits at a time. The high bit
    // of the byte when on means to continue reading more bytes.
    int count = 0;
    int shift = 0;
    byte b;
    do {
    b = ReadByte();
    count |= (b & 0x7F) << shift;
    shift += 7;
    } while ((b & 0x80) != 0);
    return count;
    }

  4. #4
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Au fait, pour lire un string sans ce soucier de la manière dont la taille peut être enregistrée (ou non) il est plus pratique de lire un byte[] avec la taille voulu et d'obtenir la chaine avec System.Text.Encoding.LeCodage.GetString(...).

  5. #5
    Membre expérimenté
    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
    Par défaut
    Bien vu !
    Mais tu te limite a une longueur 256
    Mais c'est plus que souvent largement suffisant !

  6. #6
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par olibara Voir le message
    Mais tu te limite a une longueur 256
    En quel honneur ? j'ai déjà lu des chaines de 32kb (32768) avec ...

  7. #7
    Membre expérimenté
    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
    Par défaut
    Salut !

    Je ne sais pas en quel honneur mais moi j'ai l'honneur de parler a un GRAND magicien

    Tu va devoir m'expliquer comment tu parviens a mettre une valeur de 32768 dans 1 byte

    il est plus pratique de lire un byte[] avec la taille voulu et d'obtenir la chaine avec System.Text.Encoding.LeCodage.GetString(...).

  8. #8
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Dialogue de sourd fini toujours par faire du raffut ...

    Ton problème de départ était de lire/écrire une chaine à partir d'un fichier et tu avais souligné la bizarrerie du BinaryReader à vouloir préfixer le tout d'une taille en integer 7 bit.

    Moi ce que je te proposer c'est, en connaissant la longueur de la chaine, pouvoir la lire ou l'écrire sans aucune contrainte en passant par un byte[]. La taille de la chaine tu peut la gérer toi même ou la mettre avant la chaine en utilisant un byte (256 max), un short ( 32768 ), un ushort and so on. Le reste de la conversion de byte[] vers string sera fait par les classes que l'on peut retrouver dans System.Text.Encoding.*.GetString(byte[]).

    Ainsi donc si tu "préfixe" (ou plutôt si tu rajoutes avant le string) un entier signé 32 bits, la seule limite à la taille de la chaine sera la mémoire disponible.

    Si tu veux tout de même utiliser un int 7 bits tu peut faire comme tu veux ...

  9. #9
    Membre expérimenté
    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
    Par défaut
    Yep

    Sorry j'ai sans doute lu trop vite ou interpreté avec mon idée en tete
    Je pensais que tu disais de mettre la longueur dans un Byte !
    Le problème a la base il y a deux jours c'est que ne voyais pas ce qu'un 7 bit encoded signifiait reellement
    Mais dés le moment ou le concept est capté c'est pas plus mal !
    Ta suggestion est a mon avis bonne si l'on est certain de ne pas avoir des chaines de + de 256 bytes, et qu'on peut se contenter d'un prefixe byte
    L'autre methode a l'avantage d'etre plus econome en place et de ne pas devoir connaitre a priori la longueur max.

Discussions similaires

  1. [Débutant(e)]Convertir un string en integer
    Par BernardT dans le forum Langage
    Réponses: 8
    Dernier message: 20/07/2010, 14h40
  2. Cast de string vers Integer
    Par MachProd dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 16/11/2005, 15h55
  3. Prb de longueur dans STRING
    Par jbaudin dans le forum Access
    Réponses: 14
    Dernier message: 06/09/2005, 16h46
  4. Convertion d'un String en Integer
    Par Tapioca dans le forum ASP
    Réponses: 2
    Dernier message: 16/06/2004, 10h12
  5. Concaténation de String et Integer
    Par Ingham dans le forum Langage
    Réponses: 5
    Dernier message: 21/01/2003, 17h26

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