将C ++代码转换为C#

时间:2011-04-25 06:56:18

标签: 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#中使用过它?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

你在结构之前添加了[StructLayout(LayoutKind.Sequential,Pack = 1)]吗?