Бинарные строки в шестнадцатеричные строки Java - PullRequest
0 голосов
/ 25 декабря 2011

У меня есть этот код, который получает простой текст и превращает его в 512-битную двоичную строку. Затем я хотел бы превратить каждый 32-битный фрагмент строки в 8-битный шестнадцатеричный код, но эта часть дает мне java.lang.NumberFormatException

// ----- Turning the message to bits
        byte[] binaryS = s.getBytes("UTF-8");
        String mesInBinary = "";
        for (byte b : binaryS) {
            mesInBinary += '0' + Integer.toBinaryString(b);
        }
        // ----- Message padding & Pre-Processing
        // Binary representation of the length of the message in bits
        String mesBitLength = Integer.toBinaryString(mesInBinary.length());
        // We need the size of the message in 64-bits, so we'll
        // append zeros to the binary length of the message so
        // we get 64-bit
        String appendedZeros = "";
        for (int i = 64 - mesBitLength.length() ; i > 0 ; i--)
            appendedZeros += '0';
        // Calculating the k zeros to append to the message after
        // the appended '1'
        int numberOfZeros = (448 - (mesInBinary.length() + 1)) % 512;
        // Append '1' to the message
        mesInBinary += '1';
        // We need a positive k
        while (numberOfZeros < 0)
            numberOfZeros += 512;
        for (int i = 1 ; i <= numberOfZeros ; i++)
            mesInBinary += '0';
        // append the message length in 64-bit format
        mesInBinary += appendedZeros + mesBitLength;
        System.out.println(mesInBinary);
        // ----- Parsing the padded message
        // Breaking the message to 512-bit pieces
        // And each piece, to 16 32-bit word blocks
        String[] chunks = new String[mesInBinary.length() / 512];
        String[] words = new String[64 * chunks.length];
        for (int i = 0 ; i < chunks.length ; i++) {
            chunks[i] = mesInBinary.substring((512 * i), (512 * (i + 1)));
            // Break each chunk to 16 32-bit blocks
            for (int j = 0 ; j < 16 ; j++) {
                words[j] = Long.toHexString(Long.parseLong(chunks[i].substring((32 * j), (32 * (j + 1)))));
            }
        }

Последняя строка кода является проблемной, и я получаю исключение. Есть предложения?

Ответы [ 3 ]

2 голосов
/ 25 декабря 2011

Последнее утверждение * должно указывать основание 2, я думаю:

words[j] = Long.toHexString(
    Long.parseLong(chunks[i].substring((32 * j), (32 * (j + 1))), 2));

* Не последняя строкакод, MdΓΓ: -)

0 голосов
/ 25 декабря 2011
for (int i = 0 ; i < chunks.length ; i++) 
{
     chunks[i] = mesInBinary.substring((512 * i), (512 * (i + 1)));
     // Break each chunk to 16 32-bit blocks
     for (int j = 0 ; j < 16 ; j++) 
     {
         words[j] = Long.toHexString(Long.parseLong(chunks[i].substring((32 * j), (32 * (j + 1))),2));
     }
 }
0 голосов
/ 25 декабря 2011

Из Long документов :

public static long parseLong(String s) throws NumberFormatException:

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

public static long parseLong(String s, int radix) throws NumberFormatException:

Анализирует строковый аргумент как длинную со знаком в указанном основании по второму аргументу.Все символы в строке должны быть цифрами указанного радиуса ...

Вы вызываете первую версию Long.parseLong(), которая ожидает десятичное число , а небинарный.Используйте вторую версию с radix , равным 2, для обозначения двоичного файла.

EDIT: Причина в том, что 32-значное десятичное число не помещается в Long, но двоичный будет.

...