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).
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. –
Le tableau est rempli avec des octets nuls dans la chaîne C++, après les données que je voulais revenir. –
Les deux finissent par être deux (m_EncryptDat.GetLength() et tEnc.Length/2) –