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++/CLI Discussion :

Conversion C#-> C++ CLI


Sujet :

C++/CLI

  1. #1
    Membre � l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    5
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5
    Par d�faut Conversion C#-> C++ CLI
    Bonjour et merci pour votre contribution

    Je ne vois pas comment convertir cette fonction C# en C++ CLI, en particulier la ligne string result ... en sachant qu'en C++ CLI, la fonction ne peut retourner une String:
    En fait, je ne comprends pas et je n 'ai rien trouv� sur le net concernant le String.Concat(buffer.Select(x => x.ToString("X2")).ToArray());
    Si quelqu'un sait et a un peu de temps � me consacrer, merci d'avance.

    static Random random = new Random();
    //static Random ^ random = gcnew Random();

    public static string GetRandomHexNumber(int digits)
    {
    byte[] buffer = new byte[digits / 2];
    //array<unsigned char>^ buffer = gcnew array<unsigned char>(digits / 2);
    random.NextBytes(buffer);
    //random->NextBytes(buffer);
    string result = String.Concat(buffer.Select(x => x.ToString("X2")).ToArray());
    //?
    if (digits % 2 == 0)
    return result;
    return result + random.Next(16).ToString("X");
    }

  2. #2
    Expert confirm�
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 144
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activit� : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 144
    Par d�faut
    Hello,

    L'id�e qu'une fonction C++/CLI ne peut pas retourner une String est incorrecte. Elle peut et doit retourner un String^ pour �tre compatible avec.NET.

    Source : https://www.functionx.com/cppcli/fun.../Lesson03c.htm

    La logique C# d�cortiqu�e simplement :

    1. buffer.Select(x => x.ToString("X2")) : Pour chaque octet (byte) dans le buffer, convertis-le en une cha�ne hexad�cimale de deux caract�res (par exemple, la valeur 10 devient "0A").
    2. .ToArray() : Met tous ces petits bouts de cha�nes dans un tableau.
    3. String.Concat(...) : Colle tous ces bouts de cha�nes ensemble pour en former une seule.


    Puisque C++/CLI n'a pas LINQ, on reproduit cette logique avec une boucle, ce qui est tout aussi efficace. La meilleure fa�on de construire une cha�ne dans une boucle en.NET est d'utiliser StringBuilder.

    https://learn.microsoft.com/en-us/do...r?view=net-9.0
    Celui qui trouve sans chercher est celui qui a longtemps cherch� sans trouver.(Bachelard)
    La connaissance s'acquiert par l'exp�rience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre � l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    5
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5
    Par d�faut
    Afin que mon pb serve � la communaut�, trouvez ci-apr�s l'int�gralit� de la fonction ( g�n�ration nb al�atoire avec un nombre paire de digits ) convertie en C++ CLI gr�ce � fred1599 que je remercie encore.
    J'ai utilis� finalement une boucle en C pur.

    public: char ConvOctHexAscii(unsigned char OctHex) {

    if (OctHex < 0x0a)
    OctHex = (OctHex + 0x30);
    else OctHex = (OctHex + 0x37);
    return (OctHex);
    }


    private: String^ GetRandomHexNumber(int digits)
    {
    Random^ random = gcnew Random();
    array< unsigned char>^ buffer = gcnew array <unsigned char>(digits / 2);
    random->NextBytes(buffer);
    array< unsigned char>^ buffer1 = gcnew array <unsigned char>(digits+1);

    for (char i = 0, j=0;j < digits/2;i++,j++)
    {
    buffer1[i] = ConvOctHexAscii(buffer[j] >> 4);
    i++;
    buffer1[i] = ConvOctHexAscii(buffer[j] & 0x0f);
    }
    buffer1[digits] = 0;

    String^ str = System::Text::Encoding:efault->GetString(buffer1);
    return str;
    }

  4. #4
    Expert confirm�
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 144
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activit� : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 144
    Par d�faut
    Hello,

    Les balises code permettent de lire proprement ton code, je le pr�sente ci-dessous

    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
    25
    26
    27
    28
    29
    public: char ConvOctHexAscii(unsigned char OctHex)
    {    
        if (OctHex < 0x0a)
            OctHex = (OctHex + 0x30);
        else
            OctHex = (OctHex + 0x37);
        return (OctHex);
    }
     
    private: String^ GetRandomHexNumber(int digits)
    {
        Random^ random = gcnew Random();
        array< unsigned char>^ buffer = gcnew array <unsigned char>(digits / 2);
        random->NextBytes(buffer);
        array< unsigned char>^ buffer1 = gcnew array <unsigned char>(digits+1);
     
     
        for (char i = 0, j=0;j < digits/2;i++,j++)
        {
            buffer1[i] = ConvOctHexAscii(buffer[j] >> 4);
            i++;
            buffer1[i] = ConvOctHexAscii(buffer[j] & 0x0f);
        }
        buffer1[digits] = 0;
     
     
        String^ str = System::Text::Encoding::Default->GetString(buffer1);
        return str;
    }
    J'ai quelques remarques,

    1. J'ai l'impression qu'on ne g�re pas le cas o� digits est un nombre impair
    2. L'objet Random est cr�� � chaque appel de la fonction, c'est une mauvaise pratique
    3. Pour Encoding:efault, si la page de code est compatible ASCII, autant �tre clair avec Encoding::ASCII
    4. L'instruction buffer1[digits] = 0; est un h�ritage du C/C++ natif. Les tableaux manag�s (array^) et les m�thodes.NET comme GetString connaissent leur propre longueur. Cette ligne est superflue et n'a aucun effet sur le r�sultat de GetString.


    Perso, j'ai l'impression que vous r�inventez un peu la roue quand m�me
    La plateforme.NET fournit des outils de plus haut niveau, optimis�s et con�us sp�cifiquement pour ce genre de t�ches.

    Comme je l'avais d�j� exprim�, utilis� StringBuilder est une bien meilleure solution, c'est dommage de ne pas avoir plus exploit� cette solution...
    Celui qui trouve sans chercher est celui qui a longtemps cherch� sans trouver.(Bachelard)
    La connaissance s'acquiert par l'exp�rience, tout le reste n'est que de l'information.(Einstein)

Discussions similaires

  1. Conversation serveur client php CLI ?
    Par echo55 dans le forum Langage
    R�ponses: 0
    Dernier message: 28/10/2015, 14h57
  2. R�ponses: 2
    Dernier message: 29/11/2013, 09h29
  3. Outil de conversion CLI vers GUI
    Par salanate dans le forum Scripts/Batch
    R�ponses: 1
    Dernier message: 17/04/2009, 11h46
  4. R�ponses: 1
    Dernier message: 17/10/2007, 14h01
  5. R�ponses: 4
    Dernier message: 28/06/2007, 17h25

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