Pregunta

I was sent the following code block by a third party client to allow me access some of there web services:

    RSACryptoServiceProvider rsaCryptoServiceProvider = new
    RSACryptoServiceProvider(dwKeySize);
    rsaCryptoServiceProvider.FromXmlString(xmlString);
    int keySize = dwKeySize / 8;
    byte[] bytes = Encoding.UTF32.GetBytes(inputString);
    int maxLength = keySize - 42;
    int dataLength = bytes.Length;
    int iterations = dataLength / maxLength;
    StringBuilder stringBuilder = new StringBuilder();
    for (int i = 0; i <= iterations; i++)
   {
     byte[] tempBytes = new byte[(dataLength - maxLength * i > maxLength) ?
     maxLength : dataLength - maxLength * i];
     Buffer.BlockCopy(bytes, maxLength * i, tempBytes, 0, tempBytes.Length);
     byte[] encryptedBytes = rsaCryptoServiceProvider.Encrypt(tempBytes, true);
     Array.Reverse(encryptedBytes);
     stringBuilder.Append(Convert.ToBase64String(encryptedBytes));
    }
    return stringBuilder.ToString();

And I have converted it from C# to VB.Net:

    Dim objEncrypter As New RSACryptoServiceProvider(Me.m_intKeySize)
    objEncrypter.FromXmlString(m_strEncryptionString)
    Dim intKeySize = Me.m_intKeySize / 8
    Dim objByte() As Byte = Encoding.UTF32.GetBytes(p_strXMLString.InnerXml)
    Dim intMaxLength As Integer = intKeySize - 42
    Dim intDataLength As Integer = objByte.Length
    Dim intIterations As Integer = intDataLength / intMaxLength
    Dim strResult As StringBuilder = New StringBuilder

    For intCounter As Integer = 0 To intIterations
        Dim tempBytes(IIf(intDataLength - intMaxLength * intCounter > intMaxLength, intMaxLength, intDataLength - intMaxLength * intCounter)) As Byte
        Buffer.BlockCopy(objByte, intMaxLength * intCounter, tempBytes, 0, tempBytes.Length)
        Dim objEncryptedBytes() As Byte = objEncrypter.Encrypt(tempBytes, True)
        Array.Reverse(objEncryptedBytes)
        strResult.Append(Convert.ToBase64String(objEncryptedBytes))
    Next

    Return strResult.ToString

The problem is it keeps throwing the following exception:

System.ArgumentException: Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection.

I can see what it's doing, trying to address areas of the byte array the don't exists but I can't see why. Unless either the C# code doesn't work or something has gotten lost in the translation. Any suggestions?

Kevin

¿Fue útil?

Solución

VB arrays are declared using the upper bound, not the length. So use:

Dim tempBytes(If(dataLength - maxLength * i > maxLength, maxLength, dataLength - maxLength * i) - 1) As Byte

Also, you should use VB integer division for the following:

Dim iterations As Integer = dataLength \ maxLength
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top