最近,我正在编写一个用于加密字符串的程序。我有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);
}
答案 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
,因此data
是String
,我认为您实际上需要的代码是这样的:>
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--))