Хорошо, поэтому у меня есть этот код, и я передаю его неуправляемой DLL, к которой я знаю только экспорт, и имею некоторый пример кода. Я возвращаю правильную строку, но за ней следуют байты мусора.C++ to VB.Net IntPtr Strings
Я в основном переводю код verbatim из примера программы C++, у которой нет этой проблемы. Я предполагаю, что есть что-то фундаментальное, чего я здесь не вижу, поэтому, если кто-нибудь скажет мне, что это такое, я был бы признателен.
Пример C++ код
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);
}
Этот код выплевывает этот ܉Òdÿo
Вот мой 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
Этот код плюет на это
܉Òdÿo ålUäÙålUäÙålUäÙålUäÙålUäÙålUäÙålUäÙ
Итак, я получаю правильную строку, но за ней следует повторяющаяся строка символов мусора. Я надеюсь, что я сделал что-то явно неправое, но я попытался вытащить данные в виде байтов и символов, а также преобразовать их во множество разных методов, и я не могу избавиться от этих символов ... Кроме того, ExtractDat
не возвращает длину строки (не проблема, как это не предполагается, что действительно раздражает).
проверить, что 'm_EncryptDat.GetLength()' и 'tEnc.Length/2' возвращают одно и то же, потому что у меня есть ощущение, что они не являются, хотя это просто догадка. Также эти printf работают одинаково в VB как он работает в C, где он останавливается на «\ 0» или отображает все это с момента своего массива, пытаясь напечатать больше символов в коде C и посмотреть, нет ли каких-либо различий в коде VB. –
Массив заполняется нулевыми байтами в строке C++ после данных, которые я хотел вернуть. –
Оба в конечном итоге являются двумя (m_EncryptDat.GetLength() и tEnc.Length/2) –