Взятие строкового представления большого целого числа и преобразование его в байтовый массив в Java - PullRequest
2 голосов
/ 07 ноября 2011

По сути, моя проблема двоякая, и она довольно конкретно относится к биткойн-RPC.Я пишу майнер на Java для Litecoin (ответвление BTC) и мне нужно взять строку, которая выглядит следующим образом:

000000000000000000000000000000000000000000000000000000ffff0f0000

Преобразовать его в

00000fffff000000000000000000000000000000000000000000000000000000

(которыйЯ полагаю, что переключается с прямым порядком байтов на обратный порядок байтов)

Затем мне нужно превратить эту строку в байтовый массив -

Я посмотрел на класс Hex из org.apache, String.toByte () и фрагмент кода, который выглядит следующим образом:

public static byte[] toByta(char[] data) {
    if (data == null) return null;
    // ----------
    byte[] byts = new byte[data.length * 2];
    for (int i = 0; i < data.length; i++)
        System.arraycopy(toByta(data[i]), 0, byts, i * 2, 2);
    return byts;
}

По существу: каков наилучший способ в Java изменить порядковый номер?И как лучше всего взять строковое представление числа и преобразовать его в байтовый массив для хеширования?

РЕДАКТИРОВАТЬ: у меня был неправильный результат после изменения порядкового номера.

1 Ответ

2 голосов
/ 07 ноября 2011
  1. Integer и BigInteger имеют методы toString, принимающие основание, поэтому Вы можете получить шестнадцатеричную строку.
  2. Вы можете сделать StringBuffer из этого Строка и обратный вызов ().
  3. Затем вы конвертируете обратно в строку, используя toString (), затем получить байты через getBytes ();

Не знаю, является ли это "лучшим", но это требует небольшой работы с вашей стороны.

Если вам нужна лучшая скорость, вызовите getBytes () для исходной шестнадцатеричной строки неправильного направления (из шага 1) и поверните ее на место с помощью цикла for. например,

for (int i=0; i<bytes.length/2; i++) {
   byte temp = bytes[i];
   bytes[i] = bytes[bytes.length - i];
   bytes[bytes.length - i] = temp;
}
...