转换C++代码,以C#

问题描述:

我有代码上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

.NET的char实际上是unicode,与C++不同。你应该至少用字节替换char。然后,当你最终想要一个字节的字符串,使用Encoding类,像这样:Encoding.Default.GetString(bytes)...

+0

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

您是否在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