Java-> C # BigInteger + Math Conversion - PullRequest
2 голосов
/ 16 мая 2019

Я пытаюсь преобразовать некоторые объекты BigInteger и математику из Java в C #.

Поток Java выглядит следующим образом:

1. Construct 2 BigIntegers from a base-10 string (i.e. 0-9 values).
2. Construct a third BigInteger from an inputted byte array.
3. Create a fourth BigInteger as third.modPow(first, second).
4. Return the byte result of fourth.

Основные сложности при преобразовании в C #, по-видимому, состоят из порядкового номера и значений со знаком / без знака.

Я пробовал пару разных способов конвертировать исходные 2 BigIntegers из Java-> C #. Я считаю, что использование строки base-10 с BigInteger.Parse будет работать, как и предполагалось, но я не совсем уверен.

Еще одно осложнение связано с использованием реализации BinaryReader / BinaryWriter в C #, которая уже имеет порядок байтов (например, Java). Я использую BR / BW для предоставления байтового массива для создания третьего BigInteger и использования байтового массива, созданного из modPow (четвертого BigInteger).

Я пытался полностью изменить байтовые массивы для ввода и вывода, но все еще не получил ожидаемый результат.

Java:

public static byte[] doMath(byte[] input)
{
    BigInteger exponent = new BigInteger("BASE-10-STRING");
    BigInteger mod = new BigInteger("BASE-10-STRING");

    BigInteger bigInput = new BigInteger(input);

    return bigInput.modPow(exponent, mod).toByteArray();
}

C #:

public static byte[] CSharpDoMath(byte[] input)
{
    BigInteger exponent = BigInteger.Parse("BASE-10-STRING");
    BigInteger mod = BigInteger.Parse("BASE-10-STRING");

    // big->little endian
    byte[] reversedBytes = input.Reverse().ToArray();

    BigInteger bigInput = new BigInteger(reversedBytes);

    BigInteger output = BigInteger.ModPow(bigInput, exponent, mod);

    // little->big endian
    byte[] bigOutput = output.ToByteArray().Reverse().ToArray();

    return bigOutput;
}

Мне нужны одинаковые выходные данные для обоих.

...