Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从非托管unicode字符串创建SecureString_C#_Unicode_Pinvoke_Marshalling_Securestring - Fatal编程技术网

C# 从非托管unicode字符串创建SecureString

C# 从非托管unicode字符串创建SecureString,c#,unicode,pinvoke,marshalling,securestring,C#,Unicode,Pinvoke,Marshalling,Securestring,我想尝试以最好的方式将CryptUnprotectData windows API函数和.net SecureString绑定在一起。CryptUnprotectData返回一个由字节数组和字节长度组成的数据块结构。在我的程序中,这将是一个Unicode UTF-16字符串。SecureString有一个构造函数,它接受char*和length参数,因此我希望能够执行以下操作: SecureString ss = SecureString((char*)textBlob.pbData, text

我想尝试以最好的方式将CryptUnprotectData windows API函数和.net SecureString绑定在一起。CryptUnprotectData返回一个由字节数组和字节长度组成的数据块结构。在我的程序中,这将是一个Unicode UTF-16字符串。SecureString有一个构造函数,它接受char*和length参数,因此我希望能够执行以下操作:

SecureString ss = SecureString((char*)textBlob.pbData, textBlob.cbData / 2); SecureString ss=SecureString((char*)textBlob.pbData,textBlob.cbData/2);
这是可行的,但UTF-16是可变长度的,所以我真的不知道使用什么作为长度参数。上面的示例假定为2字节字符(BMP),但对于其他平面,它可能最多为4字节。我需要知道字节数组中UTF-16字符的数量。在不复制内存中的值(从而影响安全性)的情况下,最好的方法是什么。我计划尽快清零并释放字节数组。

据我所知,大多数Windows API都处理UTF-16代码点-换句话说,您将代理项对视为两个代码点,而不是单个字符。考虑到SecureString的构造函数正在处理指向.NET
System.Char
值(UTF-16)的指针,我认为您得到的代码片段很好——pbData中的元素数是其字节大小的一半

例如,如果
pbData
包含(仅)一个代理项对,
cbData
将是4,并且您仍然希望传入2作为第二个参数,因为这是构建
SecureString
System.Char
值的数量。它是一个非BMP unicode字符这一事实与它所表示的UTF-16
System.Char
值的数量无关


(是的,对非BMP数据的支持有点混乱,我怀疑几乎没有人在任何地方都能做到。我肯定我没有。幸运的是,在许多地方你不需要担心……

非常感谢Jon,这非常有意义!这些东西对我来说还是新鲜的。