Unity使用C++讀取文件的方法:
C++側(cè):
int ReadBytes(const char* szFilePath, size_t& nSize, char*& ppBuff)
{
if (nullptr == szFilePath) return -2;
FILE* fp = NULL;
fp = fopen(szFilePath, "rb");
if (nullptr == fp) return -2;
fseek(fp, 0L, SEEK_END);
nSize = ftell(fp);
fseek(fp, 0L, SEEK_SET);
ppBuff = new char[nSize];
nSize = fread(ppBuff, 1, (size_t)nSize, fp);
if (fp != NULL) {
fclose(fp);
fp = NULL;
}
return 0;
}
C#側(cè):
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)]
static extern int ReadBytes(string szFilePath, ref Int32 nSize, ref IntPtr pBuffer);
public static byte[] CSharpReadBytes(string szFilePath)
{
IntPtr pBuffer = IntPtr.Zero;
Int32 nSize = 0;
int nRetCode = ReadBytes(szFilePath, ref nSize, ref pBuffer);
if (nRetCode != 0)
{
if (pBuffer != IntPtr.Zero) {
File_FreeBuffer(pBuffer);
pBuffer = IntPtr.Zero;
}
return null;
}
byte[] buffer = new byte[nSize];
Marshal.Copy(pBuffer, buffer, 0, nSize);
if (pBuffer != IntPtr.Zero)
{
File_FreeBuffer(pBuffer);
pBuffer = IntPtr.Zero;
}
return buffer;
}
這里在使用時如果將CSharpReadBytes函數(shù)得到的byte數(shù)組傳回到c++側(cè)用char*接住,會出現(xiàn)尾部有怪異字符(在使用中時,用的是xml文件,進而會導(dǎo)致解析xml失敗)。
為了解決這個問題,可以在初始buffer時,多給一個byte用于傳結(jié)束符。即:
byte[] buffer = new byte[nSize + 1];
Marshal.Copy(pBuffer, buffer, 0, nSize);
buffer[nSize] = 0;
這樣,在C++端解析的時候,能準(zhǔn)確識別完整的字符串。這是由于C++的字符串機制決定的,必須有\(zhòng)0結(jié)尾。