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 :

"Transposition" string en byte[]


Sujet :

C#

  1. #1
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut "Transposition" string en byte[]
    Bonjour,

    Dans le cadre d'un test, j'ai un fichier texte rempli de la manière suivante : "1,35,0,2,0,85,2,158,0,0,0,33,230,15, ..."

    Avec un split, je transforme cette chaine de caractères en un string[] :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    string[0] = 1
    string[1] = 35
    string[2] = 0
    string[3] = 2
    string[4] = 0
    string[5] = 85
    string[6] = 2
    string[7] = 158...
    Mais je souhaiterais obtenir un tableau de byte[] rempli de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    byte[0] = 1
    byte[1] = 35
    byte[2] = 0
    byte[3] = 2
    byte[4] = 0
    byte[5] = 85
    byte[6] = 2
    byte[7] = 158...
    Comment faire ?
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  2. #2
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 639
    Points : 2 148
    Points
    2 148
    Par défaut
    Bonjour,

    autant convertir en bytes de suite , de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        string taChaine; // Le contenu de ton fichier
     
        byte[] bytes = new byte[taChaine.Length * 2]; // Le tableau de bytes avec la bonne taille
        System.Buffer.BlockCopy(taChaine.ToCharArray(), 0, bytes, 0, bytes.Length); // On convertit et rempli le tableau

  3. #3
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Ca c'est un job pour LINQ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string input = "1,35,0,2,0,85,2,158,0,0,0,33,230,15";
    byte[] bytes = input.Split(',').Select(s => byte.Parse(s)).ToArray();
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  4. #4
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Je vais tester, et je vous fais un retour dès que j'ai les résultats.

    [edit]

    En relisant vos propositions, je pense que vous avez mal compris mon cas, donc je vais expliquer d'une autre manière.

    Je lis un fichier texte, qui me permet de récupérer une chaine de caratère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string = "1,35,0,2,0,85,2,158,0,0,0,33,230,15, ..."
    Et, à partir de cette donnée, je souhaiterai faire l'équivalent de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    byte[] tab_byte = {1,35,0,2,0,85,2,158,0,0,0,33,230,15, ...}
    Donc ce n'est pas réellement une "conversion", mais plutôt une transposition

    Suis-je plus clair ?

    [/edit]
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  5. #5
    Membre du Club Avatar de Parmifer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

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

    Informations forums :
    Inscription : Février 2014
    Messages : 39
    Points : 51
    Points
    51
    Par défaut
    Salut !
    Le code de Pragmateek est bon !
    Parmifèr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(cafe <= 0)
    {
        developper = false;
    }

  6. #6
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Citation Envoyé par Parmifer Voir le message
    Le code de Pragmateek est bon !
    Ca ne compile pas, j'ai l'erreur suivante : "Les arguments de type pour la méthode 'System.Linq.Enumerable.Select<TSource,TResult>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,int,TResult>)' ne peuvent pas être déduits à partir de l'utilisation. Essayez de spécifier les arguments de type de façon explicite."

    Dans la portion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select(s => byte.Parse(s))
    Je dois remplacer le s par ma chaine de caractère ou c'est autre chose ?

    Je précise que je suis sous VS 2010 en .Net 3.5
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  7. #7
    Membre du Club Avatar de Parmifer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

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

    Informations forums :
    Inscription : Février 2014
    Messages : 39
    Points : 51
    Points
    51
    Par défaut
    "s" est le nom du delegate utilisé en fait.

    Là je pense que c'est à cause de ta version de .NET que ça ne marche pas.

    Fait la conversion dans un for alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    string input = "1,35,0,2,0,85,2,158,0,0,0,33,230,15";
    string[] splitedInput = input.Split(',');
    byte[] bytes = new byte[splitedInput.Length];
    for (int i = 0; i< splitedInput.Length; i++)
    {
        bytes[i] = Convert.ToByte(splitedInput[i]);
    }
    Parmifèr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(cafe <= 0)
    {
        developper = false;
    }

  8. #8
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Citation Envoyé par Parmifer Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        bytes[i] = Convert.ToByte(splitedInput[i]);
    En utlisant Convert.ToByte, si splitedInput[i] = "135", est-ce que byte[i] = 135 ou byte[i] va-t-il avoir une autre valeur ?
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  9. #9
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Citation Envoyé par shadowmoon Voir le message
    Ca ne compile pas, j'ai l'erreur suivante : "Les arguments de type pour la méthode 'System.Linq.Enumerable.Select<TSource,TResult>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,int,TResult>)' ne peuvent pas être déduits à partir de l'utilisation. Essayez de spécifier les arguments de type de façon explicite."

    Dans la portion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select(s => byte.Parse(s))
    Je dois remplacer le s par ma chaine de caractère ou c'est autre chose ?

    Je précise que je suis sous VS 2010 en .Net 3.5
    Euh bizarre il n'y a aucune ambiguïté pourtant.

    Au pire tente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string input = "1,35,0,2,0,85,2,158,0,0,0,33,230,15";
     
    byte[] bytes = input.Split(',').Select<string, byte>(s => byte.Parse(s)).ToArray();
    Là il devrait se calmer, ou alors le problème est ailleurs...
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  10. #10
    Membre du Club Avatar de Parmifer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

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

    Informations forums :
    Inscription : Février 2014
    Messages : 39
    Points : 51
    Points
    51
    Par défaut
    En utlisant Convert.ToByte, si splitedInput[i] = "135", est-ce que byte[i] = 135 ou byte[i] va-t-il avoir une autre valeur ?
    Oui, byte[i] aura pour valeur 135 (et j'ai testé !). Tu peux faire un affichage pour en avoir le coeur net.

    Cependant attention, il ne faut pas que tes valeurs soient strictement supérieures à 255, sinon un exception sera lancée.

    Cela dit, tu pourras la catch assez facilement dans un bloc prévu à cet effet.
    Parmifèr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(cafe <= 0)
    {
        developper = false;
    }

  11. #11
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut
    bonsoir,

    je me greffe à ce post ayant moi même le même soucis sauf que je ne connais pas à l'avance ma chaine et que je n'ai pas de séparateur (c'est pour alimenter un blob de ma base)

    j'ai trouvé ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    static byte[] GetBytes(string str)
    {
        byte[] bytes = new byte[str.Length * sizeof(char)];
        System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
        return bytes;
    }
     
    static string GetString(byte[] bytes)
    {
        char[] chars = new char[bytes.Length / sizeof(char)];
        System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
        return new string(chars);
    }
    ca rejoint la solution PixelJuice. Par contre je sais pas si cela peut répondre à votre besoin. Pour ma part cela fonctionne pour mon cas.

  12. #12
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Un p'tit message, vite fait, en passant

    Pour l'instant cette partie du logiciel est en "stand by". On doit faire des modifications / corrections sur la version en production suite à des retours clients négatifs.

    Je reviendrai vers vous en temps voulu.

    Merci à tou(te)s pour votre aide.

    @+
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

Discussions similaires

  1. [C#] Conversion d'un string en byte[] et inversement
    Par david71 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/12/2004, 15h10

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