ほとんど常にネットワーク上のデータの受信した文字(バイト)のサイズを知るために予め固定見つけ、今、次のように知っている必要がないデータの大きさ
アイデア:
1 .C ++、受信C位に可変長バイトポインタまたはアドレスを返し、C#のデータ長にアドレスを返します。
2 .C#、C ++、バイト[]長さ作成されたデータを受信し、データの長さによって返されます。
3.C#が、読み出しデータのアドレスを返すことでコピーします。
C ++コードを次のように:
extern " C " __declspec(DLLEXPORT) CHAR * GetFileByteArray(* BinfilePathのwchar_t、* BinfileName、wchar_tのINT INDEXFILE、INT * 長さ) { CHAR * chBinfilePath = nullptr、* chBinfileName = nullptr。 wchar_tTranstoChar(BinfilePath、 &chBinfilePath)。 wchar_tTranstoChar(BinfileName、 &chBinfileName)。 char型 [] = " 13345zh中文こんにちは" 。 // 前提条件需要返回变长的指针 INT FILECOUNT = はsizeof ()。 CHAR ATT = * 新しい新しい CHAR [FILECOUNT]; のmemcpy(ATT、A、FILECOUNT); * = FILECOUNT長1; // 取得したC#の長さ フリー(chBinfilePath)を、 フリー(chBinfileName); リターン ATT; // 取得したC#のポインタ }
次のようにC#の処理です。
[DLLIMPORT(" BASECORELIBRARY.dll "、項目CharSet = CharSet.Unicode、CallingConvention = CallingConvention.StdCall)] パブリック 静的 にexternのIntPtr GetFileByteArray(文字列 BinfilePath、ストリング BinfileName、INT INDEXFILE、REF INT 長さ) INT長さ= 0 。 IntPtr piBuf = InvokeDLL.GetFileByteArray(newFilePath、toBinName、0、REF の長さ)。 バイト [] arrayBuf = 新しい バイト[長さ]。 Marshal.Copy(piBuf、arrayBuf、0 、長さ)。 文字列 ST = Encoding.Default.GetString(arrayBuf)。 Console.WriteLineを(ST);
出力: 13345zh中国こんにちは