将VB转换为c#
本文关键字:转换 VB | 更新日期: 2023-09-27 18:03:43
我有一个用VB编写的加密类,我正试图翻译成c#。在VB代码中,有一段代码:
' Allocate byte array to hold our salt.
Dim salt() As Byte = New Byte(saltLen - 1) {}
' Populate salt with cryptographically strong bytes.
Dim rng As RNGCryptoServiceProvider = New RNGCryptoServiceProvider()
rng.GetNonZeroBytes(salt)
' Split salt length (always one byte) into four two-bit pieces and
' store these pieces in the first four bytes of the salt array.
salt(0) = ((salt(0) And &HFC) Or (saltLen And &H3))
salt(1) = ((salt(1) And &HF3) Or (saltLen And &HC))
salt(2) = ((salt(2) And &HCF) Or (saltLen And &H30))
salt(3) = ((salt(3) And &H3F) Or (saltLen And &HC0))
我把它翻译成c#,最后得到如下代码:
// Allocate byte array to hold our salt.
byte[] salt = new byte[saltLen];
// Populate salt with cryptographically strong bytes.
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetNonZeroBytes(salt);
// Split salt length (always one byte) into four two-bit pieces and
// store these pieces in the first four bytes of the salt array.
salt[0] = ((salt[0] & 0xfc) | (saltLen & 0x3));
salt[1] = ((salt[1] & 0xf3) | (saltLen & 0xc));
salt[2] = ((salt[2] & 0xcf) | (saltLen & 0x30));
salt[3] = ((salt[3] & 0x3f) | (saltLen & 0xc0));
当我尝试编译这个时,我在分配给salt[]的4个中的每一个都得到一个错误-代码块中的最后4行。错误是:
错误255不能隐式地将类型'int'转换为'byte'。一个显式的存在转换(您是否缺少强制类型转换?)
请原谅我的无知-我是一个相对的c#新手,我尝试了以下,但仍然得到错误:
salt[0] = ((salt[0] & 0xfc as byte) | (saltLen & 0x3 as byte));
salt[0] = ((salt[0] & (byte)0xfc) | (saltLen & (byte)0x3));
我不太确定这段代码在做什么,这可能解释了为什么我无法找出如何修复它。
当操作数小于等于int
时,位运算符总是返回int
。将结果转换为byte
:
salt[0] = (byte)((salt[0] & 0xfc) | (saltLen & 0x3));
salt[1] = (byte)((salt[1] & 0xf3) | (saltLen & 0xc));
salt[2] = (byte)((salt[2] & 0xcf) | (saltLen & 0x30));
salt[3] = (byte)((salt[3] & 0x3f) | (saltLen & 0xc0));
我不太确定这段代码在做什么
这比使用编译的语法更重要。在VB和c#之间有足够多的特性,知道代码做什么,以便您可以验证结果比仅仅修复编译器/语法错误更重要。