2013-08-19 59 views
2

谷歌没有帮助我,如我想这样即时通讯写在这里。 我有Unicode字符串在C#和C函数(在DLL中)要char(ANSI)*。 我试着做C#将字符串Unicode转换为字节Ansi

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

但我不能直接转换没有编码。我尝试使用Encode类但没有任何效果。我知道,some_function需要用char指针来调用。它指向的是字节数组。

+0

_“我尝试用编码类,但没有任何效果” _ - 表明,因为这是一个主要的解决方案。 –

回答

5

你不需要自己明确地做到这一点。

相反,使用P/Invoke声明C方法来接受类型为string的参数。

然后添加到的P/Invoke声明:然后

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

编组将转换为ANSI为你的字符串。

请注意,我假设该字符串被传递给被调用的函数,所以该参数不是一个指针被用来从被调用的函数返回一个新的字符串。

在这里看到更多的细节:http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.charset.aspx

事实上,默认为CharSet.Ansi,所以你可能只需要声明的参数作为string而不是byte*(或任何你正在使用刚才)。

+0

比我的回答更好。 – SynerCoder

+0

由于缺省字符串编组是“UnmanagedType.BStr”,因此他可能需要一个在参数上内联的'[MarshalAs(UnmanagedType.LPStr)]'。 – Romoku

+0

@SynerCoder - 你不必删除,你有另一种方法来解决这个问题。 –

3

您应该使用System.Text命名空间:

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

只适用于Unicode编码器。 –

+0

@HenkHolterman他说他有一个Unicode字符串 – SynerCoder

+1

C#中的所有字符串都是UTF-16。使用'Encode'类将获得特定格式的字节。 – Romoku