2013-08-19 72 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