0

わかりましたので、私はこのコードを持っています。それをアンマネージ dll に渡します。これには、エクスポートしか知らず、サンプル コードがいくつかあります。正しい文字列を取得していますが、その後にガベージ バイトが続きます。

私は基本的に、この問題のない 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文字列の長さを返しません(問題ではありません。想定されていないため、これは本当に面倒です)。

4

1 に答える 1

0

dll が悪かったことが判明したため、ベンダーから新しいコンパイルを取得した後、動作しているように見えました。

于 2012-09-12T02:24:07.513 に答える