2012-06-15 3 views
0

D'accord, donc j'ai ce code, et je le passe à une DLL non managé, à laquelle je ne connais que les exportations, et j'ai un exemple de code. Je récupère la chaîne correcte, mais elle est suivie par des octets de garbage.C++ à VB.Net IntPtr Strings

Je suis fondamentalement traduire le code verbatim à partir d'un exemple de programme C++ qui n'a pas ce problème. Je suppose qu'il y a quelque chose de fondamental qui me manque ici, donc si quelqu'un pouvait me dire ce que c'est, je l'apprécierais.

Exemple C++ code

void CDUKPT_TESTDlg::OnButton4() 
{ 
    // TODO: Add your control notification handler code here 
    unsigned char dataout[1024],tmp[1024],ksn[20],keyval[20]; 
    int nRet,len; 
    memset(dataout,0,sizeof(dataout)); 
    memset(ksn,0,sizeof(ksn)); 
    memset(keyval,0,sizeof(keyval)); 
    memset(tmp,0,sizeof(tmp)); 
    UpdateData(TRUE); 

    two_one((unsigned char *)m_strCURKSN.GetBuffer(m_strCURKSN.GetLength()),m_strCURKSN.GetLength(),ksn); 
    two_one((unsigned char *)m_strMACK.GetBuffer(m_strMACK.GetLength()),m_strMACK.GetLength(),keyval); 
    two_one((unsigned char *)m_EncryptDat.GetBuffer(m_EncryptDat.GetLength()),m_EncryptDat.GetLength(),dataout); 

    len=m_EncryptDat.GetLength()/2; 
    //extern int __stdcall ExtractDat(unsigned char *input, 
    //unsigned short len,unsigned char *output,unsigned char *key, 
    //unsigned char *ksn); 
    nRet=ExtractDat(dataout,len,tmp,keyval,ksn); //External Call 
    //Good string+bad trailing data comes back in tmp 
    m_Result=tmp; 
    UpdateData(FALSE); 
} 

Ce code recrache cette ܉Òdÿo 

Voici mon code VB.Net

Public Function Encrypt(ByVal inp As String) As String 
    Dim tmpSB As New StringBuilder 
    Dim i As Integer 
    Dim tKsn As Char() = TwoOne(StrCurKsn) 
    For i = tKsn.Length To 19 
     tKsn = tKsn + Chr(0) 
    Next 
    Dim tMack As Char() = TwoOne(StrMack) 
    For i = tMack.Length To 19 
     tMack = tMack + Chr(0) 
    Next 
    Dim tEnc As Char() = TwoOne(inp) 
    For i = tEnc.Length To 1023 
     tEnc = tEnc + Chr(0) 
    Next 
    Dim len As Integer = tEnc.Length/2 

    Dim tmpStr(1023) As Char 
    Array.Clear(tmpStr, 0, 1024) 
    Dim tmpPtr = Marshal.StringToHGlobalAnsi(tmpStr) 

    Dim nRet = ExtractDat(tEnc, len, tmpPtr, tMack, tKsn) 

    tmpStr = Marshal.PtrToStringAnsi(tmpPtr) 
    Dim tsl = tmpStr.Length 
    Encrypt = tmpStr 
End Function 

Ce code recrache ceci

܉Òdÿo ålUäÙålUäÙålUäÙålUäÙålUäÙålUäÙålUäÙ

Donc, j'obtiens la bonne chaîne, mais elle est suivie par une série de caractères répétitifs. J'espère que j'ai fait quelque chose de manifestement faux ici, mais j'ai essayé d'extraire les données en octets, en caractères, et en les convertissant de différentes façons, et je n'arrive pas à me débarrasser de ces caractères ... En outre, ExtractDat ne retourne pas la longueur de la chaîne (pas un problème, car il n'est pas censé, ce qui est vraiment ennuyeux).

+0

vérifier que 'm_EncryptDat.GetLength()' et 'tEnc.Length/2' retournent la même chose, parce que j'ai le sentiment qu'ils ne sont pas si c'est juste une intuition, Aussi ces printf fonctionnent de la même manière dans VB que il fait en C où il s'arrête au '\ 0' ou affiche-t-il le tout depuis son tableau, en essayant d'imprimer plus de caractères dans le code C et de voir s'il y a des différences par rapport au code VB. –

+0

Le tableau est rempli avec des octets nuls dans la chaîne C++, après les données que je voulais revenir. –

+0

Les deux finissent par être deux (m_EncryptDat.GetLength() et tEnc.Length/2) –

Répondre

0

Il s'avère que la DLL était mauvaise, donc après avoir obtenu une nouvelle compilation du vendeur, il a semblé fonctionner.