C로 개발된 정규 Dll 과의 개발을 연동하다 보면 데이타 형에 대한 문제에 부딫히고 한다.
이번에 개발을 진행하면서 IntPtr 형에 대한 형변환이 문제가 되었다.
닷넷에서 기본적으로 제공해 주는 메소드가 있다.
System.Runtime.InteropServices.Marshal.PtrToStringAuto(Intptr)
이걸 사용하니 정상적인 데이타 처리가 어려울 경우도 있다.
AnsiString 과 Utf-8 의 구조에 대한 문제 였다.
이에 함수를 구성해 보았다.
변환 함수
unsafe static byte[] IntPtrTobyte(IntPtr ptr)
{
if (ptr == IntPtr.Zero) return new byte[0];
void* vPtr = ptr.ToPointer();
byte* tmpP = (byte*)vPtr;
int len = 0;
for (len = 0; tmpP[len] != 0; len++) ;
byte[] tmp = new byte[len];
for (int i = 0; i < tmp.Length; i++)
tmp[i] = tmpP[i];
return tmp;
}
public static string Utf8ByteToString(byte[] dBytes)
{
return System.Text.Encoding.UTF8.GetString(dBytes, 0, dBytes.Length);
}
사용법
IntPtr ptr = getIntPtrData(); //Dll 에서 가져오는 IntPtr 데이타
byte[] bytes = IntPtrTobyte(ptr);
string data = Utf8ByteToString(bytes);
byte[] bytes = IntPtrTobyte(ptr);
string data = Utf8ByteToString(bytes);

Prev
Rss Feed