Почему C# и Java BigInteger по-разному конвертируют byte []? - PullRequest
4 голосов
/ 01 августа 2020

Это Java код:

new BigInteger("abc".getBytes()).toString();

и результат 6382179 .

Я хочу тот же результат в C#, но когда я использую следующий код:

(new System.Numerics.BigInteger(System.Text.Encoding.ASCII.GetBytes("abc"))).ToString();

Я получаю 6513249 .

Как преобразовать строку в C# так же, как Java?

1 Ответ

8 голосов
/ 01 августа 2020

C# s BigInteger обрабатывает массив байтов как прямой порядок байтов:

Параметры

значение Byte[]

Массив байтовых значений в обратном порядке.

В то время как Java BigInteger обрабатывает байтовый массив как большой- endian:

Преобразует массив байтов, содержащий двоичное представление BigInteger с дополнением до двух, в BigInteger. Предполагается, что входной массив находится в байтовом порядке с прямым порядком байтов: самый значимый байт находится в нулевом элементе.

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

Также обратите внимание, что Java String.getBytes использует кодировку по умолчанию, которая может не быть ASCII. Вы должны использовать

StandardCharsets.US_ASCII.encode("abc").array()
// or
"abc".getBytes(StandardCharsets.US_ASCII)

, чтобы получить тот же набор байтов, что и код C#.

...