Ecriture en mémoire d'une chaine de caractère [Résolu]

Signaler
Messages postés
13
Date d'inscription
jeudi 3 juillet 2008
Statut
Membre
Dernière intervention
21 avril 2009
-
Messages postés
13
Date d'inscription
jeudi 3 juillet 2008
Statut
Membre
Dernière intervention
21 avril 2009
-
Salut à tous,

Dans mon code en C#, je récupère une string qui est écrite dans un fichier XML de config. Mon but est d'obtenir un char*.
J'ai d'abord utilisé la fonction ToCharArray() pour convertir ma String en tableau de caractères.
Ensuite j'ai lu que pour faire pointer un pointeur sur le premier élément du tableau il fallait être en contexte "fixed" j'ai donc essayé la chose suivante :

char[] Path = sImageFile.ToCharArray();
fixed (char* pFilePath = Path)
    { ...

Mon problème est qu'en mémoire, chaque élément constituant la chaine de caractère est séparé d'un autre par un "." :
0x012E81F0   44 00 3a 00 2f 00 4f 00 43 00 54 00 2f 00 49 00 4d 00 47 00 00 00 00 00 30 16 33 79 04 00 00 00 2e 00 6a 00 70 00 32 00 00 00 00 00 00  D.:./.X.X.X./.I.M.G.
Cette chaine de caractère doit être envoyée à une fonction C qui compare deux chaines... Ces "." empêchent la comparaison... Mon seul recourt pour le moment à été de recréer une nouvelle chaine en prenant un élément sur deux.... D'une efficacité redoutable !!! ^^

Quelqu'un a une idée ???

PS : au départ j'avais créé une fonction pas très utile qui faisait la chose suivante :

private void StringToChar(String sName, char* pName)
        {
            int staille = sName.Length;
            char[] Name = sName.ToCharArray();

            for (int i = 0; i < staille; i++)
            {
                *(pName + i) = Name[i];
            }
        }

Et là le constat est le même....sauf que je n'ai pas besoin d'être en contexte "fixed".

4 réponses

Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
Salut.

Qu'on me corrige si je me trompe, mais en .net, un char est codé sur 16 bits (ce qui expliquerait d'ailleurs ton problème). Tente peut-être d'utiliser un byte, qui par définition fait 1 octet.

PS : *(pName + i) = Name[i]; c'est faisable sans fixed ou unsafe en C# ?? J'apprends un truc.

Krimog : while (!(succeed = try())) ;
- Quand le règlement tu respecteras, ravis de te répondre on sera -
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
Salut,

On peut fixer une chaine sans la convertir en tableau.. Comme l'a précisé Krimog les chars sont codés sur 2 octets en C#, soit tu fais une conversion vers un  tableau de bytes ASCII soit tu utilises l'attribut CharSet si il s'agit de passer le pointeur à une fonction C.
 
Messages postés
13
Date d'inscription
jeudi 3 juillet 2008
Statut
Membre
Dernière intervention
21 avril 2009

Salut,

Merci pour vos réponses !
Krimog, non effectivement tu as raison on ne peut pas utiliser les pointeurs si on est pas dans un contexte unsafe; La fonction ci-dessus se trouve en fait dans une structure elle-même déclarée unsafe étant donné que j'utilise beaucoup de pointeurs...(j'intègre une librairie C dans un programme C#...)
Sinon je ne connaissait pas l'attribut CharSet jvais peut-être regarder de ce côté ! Je vais aussi voir ce que ça donne avec un byte , ça me laisse plusieurs pistes à explorer merci à vous deux ;)
Messages postés
13
Date d'inscription
jeudi 3 juillet 2008
Statut
Membre
Dernière intervention
21 avril 2009

Bon j'ai regardé mais j'ai pas bien compris comment utiliser cet attribut CharSet...
Finalement j'ai réutilisé ma super fonction en la modifiant un peu  :

int sF = sImageFile.Length;
byte* pFP = stackalloc byte[sF + 1];
StringToByte(sImageFile, pFP);
/****************************************/
private void StringToByte(String sName, byte* pName)
        {
            int staille = sName.Length;
            char[] Name = sName.ToCharArray();

            for (int i = 0; i < staille; i++)
            {
                *(pName + i) = Convert.ToByte(Name[i]);
            }
        }
/****************************************/
char* pFilePath = (char*)pFP;

je passe ensuite mon char* à ma fonction C et ça marche impec... !
Si quelqu'un a une solution plus optimisée je suis toujours preneur !
Merci