转换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#中?
.NET的char实际上是unicode,与C++不同。你应该至少用字节替换char。然后,当你最终想要一个字节的字符串,使用Encoding类,像这样:Encoding.Default.GetString(bytes)...
你是100%正确的;-) – NickD 2011-04-25 07:18:54
您是否在struct之前添加了[StructLayout(LayoutKind.Sequential,Pack = 1)]?
是的,当然。 – user348173 2011-04-25 07:04:34
你有没有试过使用Marshal.PtrToStructure? – NickD 2011-04-25 07:06:25
不,你能告诉我更多的细节吗 – user348173 2011-04-25 07:11:00
我不知道C#所以这可能是无关的,但'pData'在C++代码被视为'char *',并且看起来像在C#代码中被视为“int *”。当你做指针算术时,这是两个完全不同的东西。 – Mat 2011-04-25 07:17:12
你可以看看这个[链接](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