-25,50,111,23,14,-106,-61,-72,98,-24,-117,-60,-10,3,70,70,Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 16
at JavaTest.HashTest(JavaTest.java:306)
at JavaTest.main(JavaTest.java:28)数组越界了,那么是不是说这个数组应该是16位以上呢? byte[] pucHash = new byte[16];
int[] puiHashLength = new int[16];
javaapi.HashFinal(sessionhandle, pucHash, puiHashLength);
for (int i = 0; i < puiHashLength[0]; i++)
{
    System.out.print(pucHash[i] + ","); }
把pucHash[16]增大?

解决方案 »

  1.   

    for (int i = 0; i < puiHashLength[0]; i++) { System.out.print(pucHash[i] + ","); }这么写有问题
      

  2.   

    puiHashLength[0] 改成 pucHash.length
      

  3.   

    之前定义的是puchash.length 这样是int型啊,需要的是int[] 型。理由,我也不知道为什么需要int [] 型。在头文件里面是OUT unsigned int  *puiHashLength ,JNI
      

  4.   

    for (int i = 0; i < puiHashLength[0]; i++)
    这句改成
    for (int i = 0; i < pucHash.length; i++)
    这样才能保证循环内部的pucHash[i]不会越界
      

  5.   

    你能保证这个puiHashLength里面存的是对应的长度,没有过大或者过小??
    还是用pucHash.length吧
      

  6.   

    puiHashLength[0]获取的是数组的第一个位置的值
    puiHashLength.length获取的是数组的长度,只有循环数组的长度才不会越界。
    比如puiHashLength是16,但是puiHashLength[0]的值是20
    那么你的代码就循环了20次,而不是16次,所以越界了。
      

  7.   

    我觉得数组越界不是因为这个puiHashLength[0]的问题,而是pucHash数组定义的时候是16位,实际上是20位。下面代码是另外一个地方的代码,这里定义长度也是以数组的形式。循环中也是PuiKeyLen[0]。
    而实际上,输出结果确实是循环了128次。原理,我也不知道。估计是这个函数本身会把puiHash的长度存到Length数组的第一位吧。而我也试过,把他换成PucKey.length的形式,输出也是正确的! int keyhandle;
    byte[] PucKey=new byte[128];
    int[] PuiKeyLen=new int[16];
    int uikeybits=128;//密匙模的比特长度 //生成会话密钥并用内部RSA公钥加密输出--返回会话密钥句柄
    keyhandle = javaapi.GenerateKeyWithIPK_RSA(sessionhandle,uiIPKindex,uikeybits,PucKey,PuiKeyLen);
    System.out.println("RSA会话密钥转化为byte数组:");
    for(int i=0;i<PuiKeyLen[0];i++)
    {
    System.out.print(PucKey[i]+",");

    }输出结果“:
    RSA会话密钥转化为byte数组:
    -125,-78,-97,83,-38,107,-29,-32,-57,-126,-77,72,23,126,115,54,89,116,-128,72,-22,-115,-3,-64,-50,56,37,102,22,-97,35,85,-100,-37,23,-26,-31,-8,4,127,-66,93,-38,101,49,-87,12,-9,-122,26,7,10,20,-5,-34,-45,-70,-78,-29,-62,-68,73,-88,-13,112,-34,-62,46,-113,84,-120,-121,-66,22,-17,75,-95,122,-27,-112,114,93,36,88,105,-3,86,7,105,-67,-89,97,-76,-101,95,-102,98,101,-75,-92,-92,-86,20,78,-112,-111,-53,-4,95,-126,-21,35,-107,114,-99,-34,29,-50,-35,21,-42,100,-28,-15,-21,101,21,33,
      

  8.   


    不管怎样,你要确保循环次数别超过数组长度
    既然你不能确定PuiKeyLen[0]的值是什么,这样写代码就是不安全的
    用pucHash.length才是安全的!
      

  9.   

    你能确保每次调用函数得到puiHashLength[0]都是20吗?如果能确保,把byte[] pucHash = new byte[16];改成20也可以,前提是你要能知道返回的长度大小,否则还是按定义的数组长度循环比较合理
    即取puiHashLength[0]和pucHash.length的最小值作为循环
    for (int i = 0; i < Matt.min(puiHashLength[0], pucHash.length); i++)
    {
        System.out.print(pucHash[i] + ",");}
      

  10.   

    问题出现了,用.length的方法,JVM经常崩溃,非常频繁!而变成数组的话,就不会崩溃。