Конвертировать байты в int и обратно в Java / Python - PullRequest
0 голосов
/ 06 мая 2019

Я преобразую произвольную строку ascii, которая, кстати, представляет собой число, дополненное нулями, например, «1» как «0000000001», затем в байты, затем обратно в python. Конечно, значение также может быть «0000004231» и т. Д. Он всегда числовой и находится в диапазоне 32-битного значения со знаком, дополненного нулями.

Когда я говорю python, что это байты, и я хочу его в int, он преобразует его в большое большое случайное число. Затем я могу преобразовать его обратно в исходное значение позже, используя функцию to_bytes().

In [74]: value = int.from_bytes(bytes(format(1, '010d'),'ascii'), byteorder='little')                                                                                                                                                                                          

In [75]: value.to_bytes(10,byteorder=sys.byteorder)                                                                                                                                                                                                                            
Out[75]: b'0000000001'

In [76]: value                                                                                                                                                                                                                                                                 
Out[76]: 232284873704446901628976

In [77]: 

Как мне добиться того же с помощью Java?

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Точная (?) Функциональная копия вашего кода в Java:

String string = String.format("%010d", 1); // I hope this format is correct

byte[] bigEndian    = string.getBytes(StandardCharsets.US_ASCII);
System.out.println(Arrays.toString(bigEndian)); // [48, 48, 48, 48, 48, 48, 48, 48, 48, 49]

byte[] littleEndian = new byte[bigEndian.length];
for (int i = 0; i < bigEndian.length; i++)
    littleEndian[littleEndian.length - i - 1] = bigEndian[i];

BigInteger value = new BigInteger(littleEndian);
System.out.println(value); // 232284873704446901628976

И обратно:

BigInteger value = new BigInteger("232284873704446901628976");

byte[] littleEndian = value.toByteArray();

byte[] bigEndian = new byte[littleEndian.length];
for (int i = 0; i < littleEndian.length; i++)
    bigEndian[bigEndian.length - i - 1] = littleEndian[i];

System.out.println(Arrays.toString(bigEndian)); // [48, 48, 48, 48, 48, 48, 48, 48, 48, 49]

String string = new String(bigEndian, StandardCharsets.US_ASCII);
System.out.println(string); // 0000000001

int number = Integer.parseInt(string);
System.out.println(number); // 1

В любом случае, если вы сделаете код Python, используйте big-endian, вы можете пропустить обращения массива в Java.

0 голосов
/ 06 мая 2019

Я плохо разбираюсь в Python, но, возможно, что-то вроде этого:

String test = "0000000001";
byte[] testBytes = test.getBytes(); // If needed pass an encoding as argument
String newTest = new String(testBytes); // Again, if needed, pass an encoding as argument
...