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 :

Problème de conversion en hexa


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2018
    Messages : 19
    Points : 7
    Points
    7
    Par défaut Problème de conversion en hexa
    Bonjour, j'ai écrit un programme en VB.NET et je suis en train de le convertir en C#. Dans mon programme en VB, j'extrais deux chiffres d'un string X
    D0 = Mid(X, 5, 1) je récupère dans X le chiffre "0" et D1 = Mid(X, 7, 1) je récupère dans X le chiffre "6"
    D0 = Chr(Asc(D0) - 48 et D1 = Chr(Asc(D1) + 48) puis je transforme mes deux caractères en un seul caractère au format hexadécimal par
    C0 = Chr(Asc(D0) * 16) et C0 = Chr(Asc(C0) + Asc(D1)) j'obtiens dans C0 la valeur 06 en hexadécimale qui correspond en ASCII à ACK ou en binaire à 0000 0110

    Quelqu'un peut-il m'aider à convertir ce code de VB.NET en c#.
    Je vous remercie d'avance.
    astvt.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 126
    Points : 1 636
    Points
    1 636
    Par défaut
    Mid c'est SubString()
    Chr ça pourrait être un Convert.ToChar()
    Asc ça pourrait être un Convert.ToInt32()

    ou il y a la possibilité d'ajouter une référence à Microsoft.VisualBasic

    Mais tu te rajoutes des étapes il me semble
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    D0 = Mid(X, 5, 1)
    D1 = Mid(X, 7, 1) ' pourquoi avoir sauter le caractère n°6 ? il y a peut-être une explication ??
    C0= CInt(D0 & D1) 'on concatène (=>"06") et on transforme en entier (6) (C0 est ici un entier)
    C1= Chr(C0) ' si on veut le caractère correspondant (C1 est ici un caractère ou une chaine)

  3. #3
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2018
    Messages : 19
    Points : 7
    Points
    7
    Par défaut Problème de conversion en hexa
    Merci UMFRED pour votre réponse.
    ' pourquoi avoir sauter le caractère n°6 ? il y a peut-être une explication ??
    oui dans le string X il y a un point de séparation des deux caractères.
    Je vais reprendre les trois représentations de Mid, Chr, et Asc en C# dans mon programme de conversion en C#.
    Je reviendrai ici pour donner mes résultats.Cordialement ASTVT.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2018
    Messages : 19
    Points : 7
    Points
    7
    Par défaut Problème de conversion en hexa
    Bonjour, j'ai fait un tas d'essais du genre string hex = Bit.Converter.ToString(X); ou autre sans rien de concret.
    Je bloc sur l'obtention de la valeur C0 dans mon premier message.
    Ce que j’essaie de faire en C#:
    donnée D0 = 0 (chiffre 0 de valeur 30 en représentation hexa et 48 en décimale)
    donnée D1 = 6 (chiffre 6 de valeur 36 en représentation hexa et 54 en décimale)
    Donnée C0 = 06 en hexa
    Voir mon le début de mon message où j'ai mis les instructions en VB.net pour arriver à ce résultat.
    Je pense qu'en C# cela est possible, mais je n'est pas toutes les connaissances pour réaliser ce que je souhaite faire.
    Merci de votre aide.
    astv

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 126
    Points : 1 636
    Points
    1 636
    Par défaut
    ça serait mieux de mettre ton vrai code, plutôt que l'on doivent supposer le code que tu as utilisé.

    Citation Envoyé par astvt Voir le message
    donnée D0 = 0 (chiffre 0 de valeur 30 en représentation hexa et 48 en décimale)
    donnée D1 = 6 (chiffre 6 de valeur 36 en représentation hexa et 54 en décimale)
    Donnée C0 = 06 en hexa
    pour moi ça veut dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String D0="0";
    String D1="1";
    Int16 C0=Convert.ToInt16(D0+D1);
    Console.WriteLine(C0.ToString());
    Après si D0 et D1 sont des Char, il faudra les convertir en String via Char.ToString()

  6. #6
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2018
    Messages : 19
    Points : 7
    Points
    7
    Par défaut Problème de conversion en hexa
    Bonjour unfred.
    Merci pour ta réponse.
    Mon programme permet d'envoyer des données à un robot de perçage de CI de ma conception. le robot est construit autour d'un processeur Motorola MC6808.
    Le robot ne comprend que hexadécimale. Le rôle de mon programme est donc de convertir des données ASCII en hexadécimale. Exemple la valeur 6 doit être 06 en hexa ou 0000 0110 en binaire.
    Voici mon code:
    //ouverture du fichier3 *.tmp en entrée contenant les forets et les coordonnées
    FileStream fw1 = new FileStream(fichier3, FileMode.Open, FileAccess.Read);
    StreamReader sw1 = new StreamReader(fw1);
    X = sw1.ReadLine();
    while (X != null)
    {
    //recherche le caractère T dans .tmp
    A = "T";
    if (X.IndexOf(A) == 0)
    {
    //écrit dans .per le caractère T
    sr4.Write(A);
    //récupère la première valeur du diamètre du foret
    D0 = X.Substring(4, 1);
    //récupère la deuxième valeur du diamètre du foret
    D1 = X.Substring(6, 1);
    //assemble le diamètre du foret
    Int16 C0 = Convert.ToInt16(D0+D1); ----------------------------------->C0 = 6 ou 36 en hexa ce que je cherche à obtenir C0 = 06 et non 36 voila mon problème que je n'arrive pas à résoudre en C#
    //écrit dans .per la valeur du diamètre du foret en hexa
    sr4.Write(C0);
    // pour test ferme le fichier
    sr4.Close();
    }
    //recherche le caractère X début des coordonnées de perçage
    A = "X";
    //if (X.IndexOf(A) == 0) goto carX;
    }

    Cordialement
    astvt

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 126
    Points : 1 636
    Points
    1 636
    Par défaut
    Je ne comprends plus.
    Tu veux la valeur 0x06, soit l'équivalent ASCII de ACK ou le caractère ASCII "6", de valeur 0x36 ?

    La conversion doit fonctionner, mais c'est l'écriture dans le fichier via sr4 qui écrit le caractère "6" et non pas la valeur 0x06.
    C'est quoi sr4 ? (quel type?)

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462
    Par défaut
    Peut on avoir les entrées et sorties souhaités sans les étapes intermédiaires?
    On a pas le contexte global et j'avoue que c'est assez énigmatique ce que tu cherches à faire.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2018
    Messages : 19
    Points : 7
    Points
    7
    Par défaut Problème de conversion en hexa
    Bonjour umfred.
    Je voudrais transformer le caractère ASCII "6" en hexa 0x06 soit l'équivalent de ACK en ASCII.
    sr4 est mon fichier de sortie qui sera envoyé à mon robot par le port série du pc.
    Voici la définition en VB pour le ficier de sortie : FileOpen(1, fiche + ".per", OpenMode.Output, OpenAccess.Default, OpenShare.Shared)
    et en C#
    FileStream fs4 = new FileStream(fichier4, FileMode.Create, FileAccess.Write);
    StreamWriter sr4 = new StreamWriter(fs4);

    Si vous le souhaitez, je peux joindre mon programme en VB que je cherche à refaire en C#.
    Cordialement
    astvt

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 126
    Points : 1 636
    Points
    1 636
    Par défaut
    Comme je l'ai dit, le problème c'est ton écriture dans le fichier, streamWriter va convertir le 6 en "6" à l'écriture dans le fichier (conversion automatique en chaine) https://learn.microsoft.com/fr-fr/do...r?view=net-7.0

    Il faut passer par FileStream.Write ou FileStream.WriteByte (fs4.writeByte(C0)) pour écrire des octets directement.
    https://learn.microsoft.com/en-us/do...ream.writebyte

    ou encore File.WriteAllBytes(path, byte[])
    https://learn.microsoft.com/en-us/do....writeallbytes

    Tu utilisais quoi en VB ?

  11. #11
    Membre actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Points : 292
    Points
    292
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Int16 C0 = Convert.ToInt16(D0+D1);
    L'erreur est dans cette ligne
    il faut préciser la base de conversion qu'on souhaite utiliser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Int16 C0 = Convert.ToInt16(D0+D1,16);

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 126
    Points : 1 636
    Points
    1 636
    Par défaut
    Citation Envoyé par wheel Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Int16 C0 = Convert.ToInt16(D0+D1);
    L'erreur est dans cette ligne
    il faut préciser la base de conversion qu'on souhaite utiliser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Int16 C0 = Convert.ToInt16(D0+D1,16);
    Bonne précision pour l'utilisation général (dans le cas où il faut par exemple convertir "0A" en 0x0A=10).

    Mais dans le cas précis où c'est "06" à convertir en 0x06 (=6), ça ne devrait pas poser de souci.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2018
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Bonjour, j'ai sait ceci:
    carT:
    //écrit dans .per le caractère T
    sr4.Write(A);
    //récupère la première valeur du diamètre du foret
    D01 = Convert.ToChar(X.Substring(4, 1));
    //récupère la deuxième valeur du diamètre du foret
    D02 = Convert.ToChar(X.Substring(6, 1));
    //assemble le diamètre du foret
    int D001 = Convert.ToUInt16(D01 - 48);
    int D002 = Convert.ToUInt16(D02 - 48);
    int C01 = D001 * 16;
    C01 = Convert.ToInt16(C01 + D002);
    Hexa = Convert.ToByte(C01);
    //écrit dans .per la valeur du diamètre du foret en hexa
    sr4.Write(Hexa);
    //pour test ferme le fichier
    sr4.Close();
    goto traitetmp;
    Dans le fichier .per lorsque je l'édit avec Notepad++ je trouve ceci: SOHTACK soit en hexa 015406, c'est ce que je cherche à obtenir.
    J'ai défini mon fichier .per comme ceci:
    //ouverture du fichier4 *.per en sortie hexa
    FileStream fs4 = new FileStream(fichier4, FileMode.Create, FileAccess.Write);
    BinaryWriter sr4 = new BinaryWriter(fs4);
    J'ai quand même un problème avec cette définition c'est que lorsque j'écris dans le fichier, le système ajoute 01 devant le caractère T.
    Avez-vous une idée pour remédier à cet ajout , je devrais avoir TACK au lieu de SOHTACK.
    Merci pour votre aide.
    astvt

  14. #14
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 126
    Points : 1 636
    Points
    1 636
    Par défaut
    ça serait bien d'avoir la partie où tu définis ton caractère T .... il a du être mangé par le copier-coller.
    Quand tu passes un String à BinaryWriter.Write, il inscrit la longueur de la chaine en 1er pour que celle-ci puisse être avec BinaryReader.ReadString.
    Il faut donc que tu convertisses la chaine "T" en byte ou Int16 () (ou mieux, que tu partes d'un caractère 'T'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char A='T';
    sr4.Write(Convert.ToInt16(A))



    Et mets ton code entre balise de code, ça sera plus lisible (balise de code c'est le bouton # de l'interface, sinon écris directement les balises [code ] et [/code ] autour de ton code (en supprimant les espaces devant mes ]

    ET aussi, on évite les goto (surtout en C#)

  15. #15
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2018
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Bonjour umfred.
    Merci pour ta réponse, elle répond en partie à ce que je cherche à faire.
    Dans mon texte char A = "T"; est passé à la trappe.
    J'ai rectifié comme vous me le suggérez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char A = 'T';
    sr4.Write(Convert.ToInt16(A));
    Dans le fichier .per j'ai T,NUL,ACK soit 54,00,06 (les virgules sont là pour une meilleure lisibilité du résultat en réalité dans le fichier, elles n'y sont pas).
    Comme vous le voyez, mon problème n'est pas simple à résoudre.
    Je sais les goto ne sont pas recommandés en C#.
    Pour l'instant cela me facilite la conversion de mon programme écrit en VB vers C#
    Merci pour vos suggestions.
    astvt

  16. #16
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2018
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Re bonjour, je viens de faire un nouvelle essais.
    J'ai fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sr4.Write(Convert.ToSByte(A));
    au lieu de sr4.Write(Convert.ToInt16(A));
    Le résultat est OK dans mon ficher .per j'ai bien maintenant TACK.
    Je pense que nous avons résolu mon problème.
    Je reviendrai ici si j'ai d'autres pbs.
    astvt

  17. #17
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 126
    Points : 1 636
    Points
    1 636
    Par défaut
    j'ai eu un doute à te proposer ToByte; c'est lui aussi que tu devrais utiliser pour les autres cas je pense

  18. #18
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2018
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Bonjour.
    Je ferme cette discussion, mon problème est résolu.
    Je remercie umfred pour son aide.
    Cordialement astvt.

Discussions similaires

  1. Problème de conversion byte en hexa
    Par Arnaud Malabeux dans le forum C#
    Réponses: 11
    Dernier message: 04/05/2010, 15h24
  2. Problème de conversion decimal vers Hexa
    Par Elbarto dans le forum C++
    Réponses: 1
    Dernier message: 06/02/2006, 19h37
  3. Problème de conversion 3DS->.X
    Par JBernn dans le forum DirectX
    Réponses: 5
    Dernier message: 08/04/2004, 19h08
  4. Problème de conversion unicode
    Par djmalo dans le forum C
    Réponses: 5
    Dernier message: 09/03/2004, 11h48
  5. Réponses: 11
    Dernier message: 02/09/2003, 14h20

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