2011-04-25 3 views
3

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#?

+0

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

+0

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. –

Répondre

2

de charbon de .NET est en fait unicode, pas comme en C++. Vous devriez au moins remplacer char par octet. Ensuite, lorsque vous voulez en fin de compte une chaîne à partir de bytes, utilisez la classe Encoding, comme ceci: Encoding.Default.GetString (bytes) ...

+0

vous êtes 100% à droite ;-) – NickD

1

Avez-vous ajouté un avant struct [StructLayout (LayoutKind.Sequential, pack = 1)]?

+0

oui, bien sûr. – user348173

+0

avez-vous essayé d'utiliser Marshal.PtrToStructure? – NickD

+0

Non, pouvez-vous me dire plus de détails – user348173