我这里有这个代码,它获得一个纯文本,并将其转换为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。有什么建议吗?
答案 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));
}
}