我在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 :(得分:2)
.NET的char实际上是unicode,与c ++不同。你应该至少按字节替换char。然后,当你最终想要一个字节的字符串时,使用Encoding类,如下所示:Encoding.Default.GetString(bytes)...
答案 1 :(得分:1)
你在结构之前添加了[StructLayout(LayoutKind.Sequential,Pack = 1)]吗?