Ecriture en mémoire d'une chaine de caractère

Résolu
cs_ScRunCHy Messages postés 13 Date d'inscription jeudi 3 juillet 2008 Statut Membre Dernière intervention 21 avril 2009 - 20 avril 2009 à 17:10
cs_ScRunCHy Messages postés 13 Date d'inscription jeudi 3 juillet 2008 Statut Membre Dernière intervention 21 avril 2009 - 21 avril 2009 à 10:22
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

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
20 avril 2009 à 17:50
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 -
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
20 avril 2009 à 23:48
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.
 
3
cs_ScRunCHy Messages postés 13 Date d'inscription jeudi 3 juillet 2008 Statut Membre Dernière intervention 21 avril 2009
21 avril 2009 à 09:26
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 ;)
0
cs_ScRunCHy Messages postés 13 Date d'inscription jeudi 3 juillet 2008 Statut Membre Dernière intervention 21 avril 2009
21 avril 2009 à 10:22
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
0
Rejoignez-nous