来自mod整数(mod 256)的错误结果但是变为负数

时间:2016-03-02 18:40:02

标签: java

我有一个制作RC4 Sbox的功能。

public void initRC4(byte[] Key){
        byte tmp = 0;
        for(int i = 0; i< 256;i++){
            S[i] = (byte) (0xFF & i);   
        }      
        for(int j = 0 , i = 0; i< 256; i++){
            j = ((j + S[i] + Key[i % Key.length] ) % 256) ;
            System.out.println(Integer.toBinaryString(j) +" "+ j);
            tmp = S[j];
            S[j] = S[i];
            S[i] = tmp;
        }
    }

所以我对此函数的输入是getByte[]这个String“这是第一行”。但是我得到了一个异常java.lang.ArrayIndexOutOfBoundsException: -62。我的最后一行是11111111111111111111111111000010 -62。我做错了什么?

1 个答案:

答案 0 :(得分:0)

S[i]是一个字节,其值范围为-128+127,即它可以是负数。

这意味着表达式j + S[i] + Key[i % Key.length]可能为负数,负数% 256也为负数,因此j可能最终为负数。

这会导致S[j]抛出ArrayIndexOutOfBoundsException

最简单的解决方案是将% 256替换为& 0xFF