如何解决VB.net中的此错误(预期表达)

时间:2020-08-27 05:16:43

标签: c# vb.net

最近,我正在编写一个用于加密字符串的程序。我有C#的代码,所以我现在将其转换为vb,在此行代码buffer(--keySize) = Byte.Parse(data(i--))中遇到此错误(预期为错误1表达式。),我不知道如何解决它,这是我的代码

Public Function Pkcs1Pad2(data As String, keySize As Integer) As BigInteger
    If (keySize < data.Length + 11) Then
        Return New BigInteger()
    End If
    Dim buffer(256) As Byte
    Dim i = data.Length - 1
    While (i >= 0 And keySize > 0)
        buffer(--keySize) = Byte.Parse(data(i--))
    End While
    Dim random = New Random
    buffer(--keySize) = 0
    While (keySize > 2)
        buffer(--keySize) = Byte.Parse(random.Next(1, 256))
    End While
    buffer(--keySize) = 2
    buffer(--keySize) = 0
    Array.Reverse(buffer)
    Return New BigInteger(buffer)
End Function

这是原始的C#代码

private static BigInteger Pkcs1Pad2(string data, int keySize)
    {
        if (keySize < data.Length + 11)
            return new BigInteger();

        var buffer = new byte[256];
        var i = data.Length - 1;

        while (i >= 0 && keySize > 0)
        {
            buffer[--keySize] = (byte)data[i--];
        }

        // Padding, I think
        var random = new Random();
        buffer[--keySize] = 0;
        while (keySize > 2)
        {
            buffer[--keySize] = (byte)random.Next(1, 256);
            //buffer[--keySize] = 5;
        }

        buffer[--keySize] = 2;
        buffer[--keySize] = 0;

        Array.Reverse(buffer);

        return new BigInteger(buffer);
    }

3 个答案:

答案 0 :(得分:2)

在C#中,您可以增加或减少变量,并在一个表达式中使用该变量的值。您还可以在增加或减少之前或之后使用该值。如果您在C#中执行此代码:

system("gcc x.c -o x && x.exe");

然后您将看到以下输出:

10
10
10
10

10
11
10
9

11
11
9
9

没有与VB中的等效项。 VB要求您在使用该值之前或之后,分别执行递增或递减操作。与上面的C#代码等效的VB代码如下:

let prodId = null;
  if (route.params && route.params.prodId) {
    prodId = route.params.prodId;
  }

如您所见,执行增量或减量的行必须在VB中使用该值的行之前或之后,这取决于运算符是放在C#变量之前还是之后。

这意味着该行的最原义翻译:

var x1 = 10;
var x2 = 10;
var x3 = 10;
var x4 = 10;

Console.WriteLine(x1);
Console.WriteLine(x2);
Console.WriteLine(x3);
Console.WriteLine(x4);
Console.WriteLine();

Console.WriteLine(x1++);
Console.WriteLine(++x2);
Console.WriteLine(x3--);
Console.WriteLine(--x4);
Console.WriteLine();

Console.WriteLine(x1);
Console.WriteLine(x2);
Console.WriteLine(x3);
Console.WriteLine(x4);

会是这样的

Dim x1 = 10
Dim x2 = 10
Dim x3 = 10
Dim x4 = 10

Console.WriteLine(x1)
Console.WriteLine(x2)
Console.WriteLine(x3)
Console.WriteLine(x4)
Console.WriteLine()

Console.WriteLine(x1)
x1 += 1

x2 += 1
Console.WriteLine(x2)

Console.WriteLine(x3)
x3 -= 1

x4 -= 1
Console.WriteLine(x4)

Console.WriteLine()

Console.WriteLine(x1)
Console.WriteLine(x2)
Console.WriteLine(x3)
Console.WriteLine(x4)

也就是说,假设buffer[--keySize] = (byte)data[i--]; keySize -= 1 buffer(keySize) = DirectCast(data(i), Byte) i -= 1 ,因此dataString,我认为您实际上需要的代码是这样的:

data(i)

这将为您提供字符Char的ASCII / Unicode值。除非您实际上试图将数字“ 0”到“ 9”转换为数字keySize -= 1 buffer(keySize) = Convert.ToByte(data(i)) i -= 1 ,否则您最初进行的Byte调用是不正确的,而C#代码没有这样做。 / p>

答案 1 :(得分:1)

顺便说一句,它在该行上显示错误而不显示其他错误(概念上确实有错误)的原因是因为该行使用c#后缀形式的减量

正如其他人指出的那样,在c#中给--加后缀x--的意思是“递减x,但在递减x之前返回x的值”,并且其推论前缀形式为{{1 }}的意思是“递减x然后返回递减值”

这意味着x等于10:

--x

您的转换器没有触及代码中的任何减量,有时c#使用z = array[x--] //array index 10 is now in z and x is 9 z = array[--x] //array index 9 is now in z and x is 9 ,有时使用--x

这对您来说是个问题,因为x--实际上是合法的VB;在变量前加上减号与将其乘以-1相同,因此如果x为10,则说:

--x

将-10放入z

可以使用任意数量的minis符号,但是偶数是非op(双负数是正数);如果x为10,则--x为10,如---- x或------ x

Dim z = -x 不是合法的vb,因此您从编译器中收到一个错误,但是即使在修复了这一行代码后,您仍然遇到问题,即其他代码行充满了有效,但没有用底片。在c#中,这些-将变量递减。在VB中,他们没有。意思是这样的一行:

x--

在语法上是有效的vb,但在逻辑上它并没有执行您想要的操作-在c#中,如果keysize为4,则将其减小为3,然后将数组索引 3 的值设置为2。在vb中,如果keysize为4,则它的双负数仍为4,然后数组索引 four 设置为2


buffer(--keySize) = 2

我不保证此代码可以实现其声称的功能,仅保证它在逻辑上等同于C#。就我个人而言,至少有2个(如果不是3个)这些缓冲区分配仅使用固定索引就可以完成-通过/减小键大小进行索引是毫无意义的

此答案包含了jmcilhinney讨论的更深入的建议,即重新字节转换-如果您对此有投票的话,也给该答案以投票。

答案 2 :(得分:0)

尝试一下

 keySize -= 1

 buffer(keySize) = Byte.Parse(data(i))

 i -= 1

代替

   buffer(--keySize) = Byte.Parse(data(i--))