2011-04-25 139 views
3

我有代碼上C++寫道:轉換C++代碼,以C#

char szTempString[1500]; 
    DWORD dwDataLength = PacketBuffer.m_Length - (sizeof(ether_header) + pIpHeader->ip_hl*4 + pTcpHeader->th_off*4); 
    PCHAR pData = (PCHAR)pEthHeader + (sizeof(ether_header) + pIpHeader->ip_hl*4 + pTcpHeader->th_off*4); 

    // If packet contains any data - process it 
    if (dwDataLength) 
    { 
     // 
     // Copy packet payload into the temporary string 
     // 
     memcpy (szTempString, pData, dwDataLength);   

C#:

char[] szTempString = new char[1500]; 
var dwDataLength = (int)PacketBuffer.m_Length - 
(Marshal.SizeOf(typeof (ETHER_HEADER)) + (pIpHeader->IPLenVer & 0xF)*4 + (pTcpHeader->Off & 0xF)*4); 

var pData = (IntPtr)pEthHeader + (Marshal.SizeOf(typeof(ETHER_HEADER)) + 
(pIpHeader->IPLenVer & 0xF) * 4 + (pTcpHeader->Off & 0xF) * 4); 

if(dwDataLength != 0) 
{ 
    Marshal.Copy(pData,szTempString, 0, dwDataLength); 
    Console.WriteLine(szTempString); 
} 

ehter_header,pIp_header和另一個結構,它們被轉換爲C#。 var szTempString包含奇怪的數據。我是否正確地轉換了pData和函數memcpy
謝謝。 PS:這是WinPkFilter庫。也許有人用它在C#中?

+0

我不知道C#所以這可能是無關的,但'pData'在C++代碼被視爲'char *',並且看起來像在C#代碼中被視爲「int *」。當你做指針算術時,這是兩個完全不同的東西。 – Mat 2011-04-25 07:17:12

+0

你可以看看這個[鏈接](http://stackoverflow.com/questions/2559308/using-marshal-copy-correctly)。它討論如何正確使用Marshal.Copy。此外[1](http://forum.soft32.com/pda/Marshal-Copy-char-includes-terminating-null-ftopict49073.html)也可能有用。 – 2011-04-25 07:13:10

回答

2

.NET的char實際上是unicode,與C++不同。你應該至少用字節替換char。然後,當你最終想要一個字節的字符串,使用Encoding類,像這樣:Encoding.Default.GetString(bytes)...

+0

你是100%正確的;-) – NickD 2011-04-25 07:18:54

1

您是否在struct之前添加了[StructLayout(LayoutKind.Sequential,Pack = 1)]?

+0

是的,當然。 – user348173 2011-04-25 07:04:34

+0

你有沒有試過使用Marshal.PtrToStructure? – NickD 2011-04-25 07:06:25

+0

不,你能告訴我更多的細節嗎 – user348173 2011-04-25 07:11:00