반응형
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);
반응형