我正在研究一个研究项目,其中包括开发和实现SHA-256哈希算法的代码。我在我的测试程序中得到一个NumberFormatException,如下所示:
Exception in thread "main" java.lang.NumberFormatException: For input string: "11100010111000101100001110001110"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:583)
at SHA2.processHash(SHA2.java:70)
at SHA2.<init>(SHA2.java:30)
at SHATest.main(SHATest.java:4)
这些是我的SHA2类中的第60-75行:
public void processHash(String[] blocks, String[] W)
{
for(int i=0; i<16; i++)
{
W[i]=blocks[i];
}
for(int i=16; i<64; i++)
{
int binaryW = Integer.parseInt(W[i-15], 2);
int s0 = delta0(binaryW);
binaryW = Integer.parseInt(W[i-2], 2);
int s1 = delta1(binaryW);
int sum = s0 + (Integer.parseInt(W[i-16], 2)) + s1 +
(Integer.parseInt(W[i-7], 2));
W[i] = Integer.toBinaryString(sum);
}
}
不确定这里到底发生了什么。我认为我的值超过2 ^ 31-1所以我使用了一个长而不是更大但仍然得到相同的错误。
这是我整个SHA-2类的代码:GitHub Project
我对编码有些新意,所以我确信我已经对大部分代码进行了屠杀。
32位长的二进制值“11100010111000101100001110001110”对于带符号的整数而言太大,因为符号使用一位。
为了能够处理所有32位,您可以使用long binaryW = Long.parseLong(W[i-15], 2);
代替。