c# - 传递结构似乎会损坏数据

标签 c# c++ interop c++-cli cryptoapi

我有一个程序需要将数据从 C++ 传递到 C# 并返回以进行处理。为此,我检索了一个结构,将其转换为字节数组,然后在另一端将其转换回来。然而,当将它转换回来时,数据不正确,即使内存转储显示内存中每个变量的值是相同的。

这是获取值的代码:

array<Byte> ^ GetPublicKeyBlob(String ^ ContainerName) {
    const TCHAR * tContainer = context->marshal_as<const TCHAR*>(ContainerName);
    HCRYPTPROV hProv = NULL;
    CryptAcquireContext(&hProv, tContainer, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET);
    DWORD dwKeySize = 0;
    CryptExportPublicKeyInfo(hProv, AT_SIGNATURE, X509_ASN_ENCODING, NULL, &dwKeySize);
    PCERT_PUBLIC_KEY_INFO pbKey = (PCERT_PUBLIC_KEY_INFO)calloc(dwKeySize, sizeof(BYTE));
    CryptExportPublicKeyInfo(hProv, AT_SIGNATURE, X509_ASN_ENCODING, (PCERT_PUBLIC_KEY_INFO)pbKey, &dwKeySize);
    array<Byte> ^ retVal = gcnew array<Byte>(dwKeySize);
        for(int i = 0; i < dwKeySize; i++)
            retVal[i] = ((BYTE*)pbKey)[i];

    free(pbKey);
return retVal;
}

然后在另一端,我使用以下代码将其改回 PCERT_PUBLIC_KEY_INFO 结构:

BYTE * cpiBuffer = (BYTE*)calloc(_PublicKey->Length, sizeof(BYTE));
for(int i = 0; i < _PublicKey->Length; i++)
    cpiBuffer[i] = _PublicKey[i];
PCERT_PUBLIC_KEY_INFO cpi = (PCERT_PUBLIC_KEY_INFO)cpiBuffer;

在内存转储中查看它们时,pbKey、retVal、_PublicKey、cpiBuffer 和 cpi 都具有完全相同的值。但是当将 cpi 视为一个结构时,Algorithm.pszObjId 指向一些错误的内存位置,当我尝试在函数中使用它时,它失败了。我在这里做错了什么?

最佳答案

typedef struct _CRYPT_ALGORITHM_IDENTIFIER {
  LPSTR            pszObjId;
  CRYPT_OBJID_BLOB Parameters;
} CRYPT_ALGORITHM_IDENTIFIER, *PCRYPT_ALGORITHM_IDENTIFIER;

如您所见,pszObjId 是一个指针,它的内容在内存中的某处。通过将 PCERT_PUBLIC_KEY_INFO 结构转换为字节数组,您只能获得指针的值,而不是它指向的内容。

附带说明一下,我不确定您为什么要编码(marshal)为 TCHAR*,如果您需要字节,那么您应该使用 char* 或 unsigned char*。如果定义了 UNICODE,TCHAR 将是 wchar_t,这可能会造成一些困难。

关于c# - 传递结构似乎会损坏数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9115974/

相关文章:

c# - db.savechanges() 不工作

javascript - 在 DDL 中查找 optgroup 的值

c++ - mkdir,带符号的路径名

c++ - 明显的 CUDA 魔法

mysql - 如何解决 MS SQL 中不受支持的无符号整数字段类型?

c# - 如何设置调试器以捕获更改变量的内容

c++ - 变量会影响性能吗?

c# - 异步可插入协议(protocol)

c# - 如何以编程方式检查电脑上是否存在 MS Excel?

c# - 更改 xaml 中切换按钮的图标样式