J'ai le code écrit en C++:Convert C++ code 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 et d'autres est struct, ils sont convertis en C#. La variable szTempString contient des données étranges. Ai-je converti le pData et la fonction memcpy correctement?
Merci.
PS. C'est la bibliothèque WinPkFilter. Peut-être que quelqu'un l'a utilisé en C#?
Je ne connais pas C# donc cela peut ne pas être pertinent, mais 'pData' dans le code C++ est traité comme un 'char *', et on dirait qu'il est traité comme un 'int *' dans votre code C#. C'est deux choses très différentes quand vous faites de l'arithmétique de pointeur. – Mat
Pouvez-vous s'il vous plaît regarder ce [lien] (http://stackoverflow.com/questions/2559308/using-marshal-copylycorrectement). Il parle de comment utiliser Marshal.Copy correctement. Aussi ce [un] (http://forum.soft32.com/pda/Marshal-Copy-char-includes-terminating-null-ftopict49073.html) pourrait aussi être utile. –