С++ в строки VB.Net IntPtr

Итак, у меня есть этот код, и я передаю его в неуправляемую dll, для которой я знаю только экспорт, и у меня есть пример кода. Я возвращаю правильную строку, но за ней следуют мусорные байты.

Я в основном дословно перевожу код из примера программы на С++, в которой нет этой проблемы. Я предполагаю, что мне здесь не хватает чего-то фундаментального, поэтому, если кто-нибудь может сказать мне, что это такое, я был бы признателен.

Пример кода 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 не возвращает длину строки (не проблема, так как не должно, что очень раздражает).


person Kelly Elton    schedule 15.06.2012    source источник
comment
проверьте, что m_EncryptDat.GetLength() и tEnc.Length / 2 возвращают одно и то же, потому что у меня такое ощущение, что это не так, хотя это просто догадка. Кроме того, эти printf работают так же в VB, как и в C, где он останавливается на «\ 0» или делает он отображает все это, так как это массив, пытаясь напечатать больше символов в коде C и посмотреть, есть ли какие-либо отличия от кода VB.   -  person Samy Vilar    schedule 15.06.2012
comment
Массив заполняется нулевыми байтами в строке С++ после данных, которые я хотел вернуть.   -  person Kelly Elton    schedule 15.06.2012
comment
Оба заканчиваются двумя (m_EncryptDat.GetLength() и tEnc.Length/2)   -  person Kelly Elton    schedule 15.06.2012
comment
ну, как я думал, строки VB не похожи на строки C, где '\0' заканчивается lansa .com/support/tips/t0002.htm и msdn.microsoft.com/en-us/library/aa263531(v=vs.60).aspx, так что что-то влияет на длину строки, хотя я понятия не имею, что именно.   -  person Samy Vilar    schedule 15.06.2012
comment
Если вы используете байтовый буфер вместо строкового указателя, можете ли вы подтвердить, что видите нулевой байт там, где вы его ожидаете? В худшем случае используйте байтовый буфер, найдите первый нулевой байт, а затем используйте System.Text.Encoding.ASCII или .Default для преобразования байтов в строку.   -  person tcarvin    schedule 15.06.2012
comment
@tcarvin Я передал в него char() и byte() с точно такими же результатами, и если я ищу первый нулевой байт, он будет со смещением 512 после всего мусора   -  person Kelly Elton    schedule 15.06.2012
comment
Интересно... Ваш код C++ присваивает 1024-байтовый tmp m_Result. Что вы используете для вывода m_Result, чтобы получить ܉Òdÿo ? Вы уверены, что m_Result содержит null в позиции 6?   -  person tcarvin    schedule 15.06.2012
comment
Ага. Это последний шаг, который он выполняет, оттуда он отображается в текстовом поле winforms, но я отладил и просмотрел данные в нем как массив.   -  person Kelly Elton    schedule 15.06.2012


Ответы (1)


Оказалось, что dll была плохой, поэтому после того, как я получил свежий компилятор от поставщика, он, похоже, заработал.

person Kelly Elton    schedule 12.09.2012