二进制字符串到十六进制字符串java

时间:2011-12-24 23:13:57

标签: java bits sha256

我这里有这个代码,它获得一个纯文本,并将其转换为512位二进制字符串。 然后,我想将每个32位的字符串转换为8位的Hex字符串,但那部分给了我一个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)))));
            }
        }

最后一个代码行是有问题的,我得到了execption。有什么建议吗?

3 个答案:

答案 0 :(得分:2)

最后一个语句 * 应该指定2的基数,我想:

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

* 不是最后一行代码,MДΓΓ: - )

答案 1 :(得分:0)

来自Long docs

public static long parseLong(String s) throws NumberFormatException

  

将字符串参数解析为带符号的十进制长。字符串中的字符必须都是十进制数字......

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

  

通过第二个参数将字符串参数解析为基数指定中的带符号long。字符串中的字符必须都是指定基数的数字...

您正在调用Long.parseLong()的第一个版本,它需要十进制数字,而不是二进制数字。使用 radix 为2的第二个版本表示二进制文件。

编辑:原因是32位十进制数不适合Long,但二进制数将不适合。{/ p>

答案 2 :(得分:0)

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));
     }
 }