2013-08-19 6 views
2

google n'a pas m'aider tel que je voulais tellement écrire ici. J'ai une chaîne Unicode en C# et C fonction (en dll) qui veulent le char (ANSI) *. je tente de faireC# convertir la chaîne Unicode en octet Ansi

string tmp = "ala ma kota"; 
unsafe 
{ 
    fixed (byte* data = &tmp.ToCharArray()[0]) 
    { 
     some_function(data); 
    } 
} 

mais je ne peux pas convertir directement sans codage. J'essaie d'utiliser la classe Encode mais sans aucun effet. Je sais que la fonction some_function doit être appelée avec un pointeur char. Où il pointe vers le tableau d'octets.

+0

_ «J'essaie d'utiliser la classe Encode mais sans aucun effet » _ - montrent que, parce que c'est une solution principale. –

Répondre

5

Vous n'avez pas besoin de le faire explicitement vous-même.

À la place, déclarez la méthode C en utilisant P/Invoke pour accepter un paramètre de type string.

ajouter ensuite à la déclaration P/Invoke:

[DllImport("YourDllName.dll", CharSet=CharSet.Ansi)] 

Le placier sera ensuite convertir la chaîne en ANSI pour vous.

Notez que je suppose que la chaîne est passée à la fonction appelée, donc le paramètre n'est PAS un pointeur utilisé pour renvoyer une nouvelle chaîne FROM la fonction appelée.

Voir ici pour plus de détails: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.charset.aspx

En fait, la valeur par défaut est CharSet.Ansi vous pourriez donc seulement besoin de déclarer le paramètre comme string au lieu de byte* (ou tout ce que vous utilisez maintenant).

+0

Bien mieux que ma réponse. – SynerCoder

+0

Il pourrait avoir besoin d'un '[MarshalAs (UnmanagedType.LPStr)]' déclaré en ligne sur le paramètre puisque le marshaling par défaut est 'UnmanagedType.BStr'. – Romoku

+0

@SynerCoder - vous n'avez pas eu à supprimer, vous avez eu l'autre façon de résoudre ce problème. –

3

Vous devez utiliser l'espace de noms System.Text:

string tmp = "ala ma kota"; 
unsafe 
{ 
    fixed (byte* data = &System.Text.Encoding.ASCII.GetBytes(tmp)[0]) 
    { 
     some_function(data); 
    } 
} 
+0

Seulement pas avec l'encodeur Unicode. –

+0

@HenkHolterman il a dit qu'il avait une chaîne unicode – SynerCoder

+1

Toutes les chaînes en C# sont UTF-16. L'utilisation de la classe 'Encode' obtiendra les octets dans un format particulier. – Romoku