2013-08-19 2 views
2

google은 내가 여기있는 글을 쓰고 싶다는 등의 도움을받지 못했습니다. 나는 char (ANSI) *를 원하는 C# 및 C 함수 (dll)의 유니 코드 문자열을 가지고 있습니다. 나는 시도하려고합니다.C#을 유니 코드에서 바이트로 변환 Ansi

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

하지만 인코딩없이 직접 변환 할 수는 없습니다. Encode 클래스를 사용하려고하지만 효과는 없습니다. 나도 알아, some_function 숯불 포인터와 함께 호출해야합니다. 바이트의 배열을 가리키는 곳.

+0

가 _ "내가 인코딩 클래스를 사용하려고를하지만, 어떤 효과없이"_ - 쇼 그, 그 하나 개의 주요 솔루션이기 때문에. –

답변

5

직접 명시 적으로 수행 할 필요는 없습니다.

대신 P/Invoke를 사용하여 C 메소드를 선언하여 string 유형의 매개 변수를 승인하십시오.

그런 다음 P/호출 선언에 추가 :

[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

유니 코드 인코더에만 해당됩니다. –

+0

@HenkHolterman 그는 유니 코드 문자열을 가지고 있다고 말했습니다. – SynerCoder

+1

C#의 모든 문자열은 UTF-16입니다. 'Encode' 클래스를 사용하면 바이트를 특정 형식으로 가져옵니다. – Romoku