web-dev-qa-db-fra.com

pointeur char * de la chaîne en C #

Est-il possible d'obtenir un char* pour une variable string en C #?

J'ai besoin de convertir une chaîne de chemin d'accès en char* pour utiliser une fonction native win32 ...

31
Kris

Vous pouvez passer un StringBuilder en tant que char*.

Jetez un œil à http://pinvoke.net pour voir si la signature de la fonction n'est pas déjà là.

13
Geoff

Eh bien, vous pouvez certainement le faire:

string str = "my string";

unsafe 
{
    fixed (char* p = str)
    {               
        // do some work
    }
}

où il y a un opérateur (char *) lié à l'objet chaîne. Cependant, le format de sortie peut ne pas être compatible avec le C sous-jacent ou un autre format ... c'est cependant une assez bonne solution pour analyser la chaîne. J'espère que cela sera utile à quiconque lira ce message.

44
Guillau pelletier

Aucun contexte dangereux n'est requis pour le morceau de code suivant (et oui, il montre les boulons et les bits internes sur l'implémentation de la méthode stringGetHashCode montre sa différence avec un dans Java parce qu'en C #, la valeur de hashcode n'est pas mise en cache et généralement cela montre que les chaînes C # ne sont pas immuables comme vous l'avez peut-être appris, ne peuvent pas traiter avec Fon Neiman):

using System;
using System.Runtime.InteropServices;

namespace Guess
{
    class Program
    {
        static void Main(string[] args)
        {
            const string str = "ABC";

            Console.WriteLine(str);
            Console.WriteLine(str.GetHashCode());

            var handle = GCHandle.Alloc(str, GCHandleType.Pinned);

            try
            {
                Marshal.WriteInt16(handle.AddrOfPinnedObject(), 4, 'Z');

                Console.WriteLine(str);
                Console.WriteLine(str.GetHashCode());
            }
            finally
            {
                handle.Free();
            }
        }
    }
}
5
Lu4

Pour combiner 2 réponses déjà données, cela dépend de la direction dont vous avez besoin pour votre paramètre.

Si la fonction a juste besoin d'une chaîne d'entrée, c'est-à-dire const char *, vous pouvez utiliser un argument de type System.String (ou simple string).

Si la fonction remplit une chaîne, c'est-à-dire char * buffer, int bufferSize, vous pouvez passer un System.Text.StringBuilder.

Dans les deux cas, le (auto-) Marshaling fera les conversions nécessaires pour vous.

4
Henk Holterman

Cela dépend de ce que vous voulez faire. Lorsque vous appelez une fonction Win32 via PInvoke, vous devriez pouvoir passer simplement la variable String; le framework rassemble tout pour vous. Si vous avez besoin de quelque chose de plus compliqué, jetez un œil à Marshal.StringToHGlobalAnsi et aux autres méthodes de la classe Marshal.

4
Heinzi

Vous pouvez obtenir un tableau d'octets [] à partir d'une chaîne à l'aide d'Encoding.ASCII.GetBytes. Ceci est probablement convertible en char * en utilisant une instruction fixe en C #. (Cela épingle la mémoire allouée, ne permettant pas à gc de la déplacer - alors vous pouvez lui faire un pointeur).

Donc, ma réponse est oui uniquement si vous parvenez à convertir l'octet * en char *. (en C/C++, ce ne serait pas un problème, mais je ne suis pas sûr de C #)

PS> Je posterai du code plus tard si je trouve un signet pour un article à ce sujet. Je sais que je l'ai quelque part ..

0
kubal5003