2015-07-21 3 views
1

У меня есть криптографический класс, написанный на VB, который я пытаюсь перевести на C#. В коде VB, есть блок кода:Перевод VB на C#

' 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)); 

Когда я пытаюсь скомпилировать это я получаю сообщение об ошибке на каждом из 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)); 

Я не совершенно уверен, что делает этот код, что, возможно, объясняет, почему я не могу понять, как его исправить.

Любая помощь приветствуется.

+3

Попробуйте: соль [0] = (байт) ((соль [0] и 0xfc) | (сольLen & 0x3)); –

ответ

9

Побитовые операторы always return 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#, которые знают, что делает код, чтобы вы могли проверить результаты важнее, чем просто исправлять ошибки компилятора/синтаксиса.

Смежные вопросы