非托管 C++ 加密字符串转换为 C# byte[]

Posted

技术标签:

【中文标题】非托管 C++ 加密字符串转换为 C# byte[]【英文标题】:Unmanaged C++ encrypted string into C# byte[] 【发布时间】:2010-09-16 16:47:14 【问题描述】:

我有一个从 C# 类库调用的非托管 C dll,该类库将字符串值加密为包含非 ascii 字符的加密字符串。我需要获取数据并将其二进制值写入文件,但 C# 将文本视为string 而不是byte[]

加密值通常包含特殊字符(\r\O 等)。当我使用某种类型的代码集(ascii、utf-7、utf-16)将返回的字符串转换为 C# 时,它会将特殊字符值写入 Windows 解释值而不是它们的实际二进制表示。

我的问题是如何将非托管 dll 中的数据提取到 byte[] 而不是字符串中,以便我可以使用 BinaryWriter 将其写入文件?

谢谢。

【问题讨论】:

你知道它是什么类型的字符串,编码是什么吗? (我的意思是原始字符串) 【参考方案1】:

如果我理解正确,我想你可能希望 Encoding.GetBytes() 使用 UTF8?

【讨论】:

【参考方案2】:

您是否尝试过使用 ASCIIEncoding 类?它应该将任何 UTF-8 字符转换为 '?' 的 ascii 字符

MSDN Page

用法

ASCIIEncoding ascii = new ASCIIEncoding();
Byte[] encodedBytes = ascii.GetBytes(unicodeString);

【讨论】:

【参考方案3】:

您在使用 P/Invoke 吗?嗯...也许指定 [MarshalAs(UnmanagedType.*)] 会有所帮助。 此外,您可以创建一个中间 C 函数,将加密数据公开为 (void *)。这应该更容易进入 byte[]。

【讨论】:

以上是关于非托管 C++ 加密字符串转换为 C# byte[]的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 中的 std::string 获取字节

使用 COM 互操作从非托管 C++ 访问 c# 属性

使用 ATL/COM 将托管字节 [] 转换为非托管字节数组

C# 调用非托管 C++ 返回平方符号字符串

C# 托管非托管代码

使用 C++/CLI 包装器将二维数组从 C# 传递到非托管 C++