C++到VB .NET的IPTTR字符串

C++到VB .NET的IPTTR字符串,c++,vb.net,com,marshalling,intptr,C++,Vb.net,Com,Marshalling,Intptr,好的,我有这段代码,我把它传递给一个非托管dll,我只知道它的导出,还有一些示例代码。我正在返回正确的字符串,但后面是垃圾字节 我基本上是从一个C++程序中逐字翻译代码的,这个程序没有这个问题。我假设我在这里遗漏了一些基本的东西,所以如果有人能告诉我这是什么,我将不胜感激 < C++代码> /P> void CDUKPT_TESTDlg::OnButton4() { // TODO: Add your control notification handler code here

好的,我有这段代码,我把它传递给一个非托管dll,我只知道它的导出,还有一些示例代码。我正在返回正确的字符串,但后面是垃圾字节

我基本上是从一个C++程序中逐字翻译代码的,这个程序没有这个问题。我假设我在这里遗漏了一些基本的东西,所以如果有人能告诉我这是什么,我将不胜感激

< C++代码> /P>
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
这段代码会把它吐出来

Ü

所以我得到了正确的字符串,但后面是重复的垃圾字符字符串。
我希望我在这里做了一些明显错误的事情,但我尝试过以字节和字符的形式提取数据,并用许多不同的方法进行转换,我似乎无法去除这些字符…而且,ExtractDat不会返回字符串的长度这不是一个问题,因为它不应该,这真的很烦人。

原来dll是坏的,所以在我从供应商那里得到一个新的编译后,它似乎可以工作。

检查m_EncryptDat.GetLength和tEnc.Length/2是否返回相同的东西,因为我感觉它们不是,尽管这只是一种预感,此外,在VC++中,那些PrtTf与C一样工作,在它停止在“0”或显示整个事物,因为它是一个数组,尝试在C代码中打印更多字符,看看是否有任何VB代码的差异。在我想要返回的数据之后。两者最终都是twom_EncryptDat.GetLength和tEnc.Length/2,就像我认为VB字符串不像以“\0”结尾的C字符串一样,因此有些东西会影响字符串的长度,尽管我不知道是什么。如果使用字节缓冲区而不是字符串ptr,您能确认您在预期的位置看到空字节吗?最坏的情况是,使用字节缓冲区,查找第一个空字节,然后使用System.Text.Encoding.ASCII或.Default将字节转换为字符串。