【问题标题】:Array Out of Bounds exception working with Long Values使用长值的数组越界异常
【发布时间】:2013-12-04 03:59:15
【问题描述】:

我有一个函数,它接受一个 long 值作为输入并返回一个 long 值。

 static long MyBox(long S) // input is a 48-bit integer stored in 64-bit signed "long"
{
// Split I into eight 6-bit chunks
int Sa=(int)((S>>42));
int Sb=(int)((S>>36)&63);
int Sc=(int)((S>>30)&63);
int Sd=(int)((S>>24)&63);
int Se=(int)((S>>18)&63);
int Sf=(int)((S>>12)&63);
int Sg=(int)((S>>6)&63);
int Sh=(int)(S&63);
// Apply the S-boxes
byte Oa=S1Table[Sa];
byte Ob=S2Table[Sb];
byte Oc=S3Table[Sc];
byte Od=S4Table[Sd];
byte Oe=S5Table[Se];
byte Of=S6Table[Sf];
byte Og=S7Table[Sg];
byte Oh=S8Table[Sh];
// Combine answers into 32-bit output stored in 64-bit signed "long"
long O=(long)Oa<<28 | (long)Ob<<24 | (long)Oc<<20 | (long)Od<<16 | (long)Oe<<12 | (long)Of<<8 | (long)Og<<4 | (long)Oh;
return(O);
}

我将一个变量传递给这个方法,但是我得到了 ArrayIndexOutOfBoundsException。有人会知道为什么吗?这就是我通过它的方式。

  long testPassing=0x1234567887654321L;
  long result = MyBox (testPassing);

在这一步之后,我得到了一个 arrayoutofbounds 异常。

任何帮助将不胜感激!谢谢你。

【问题讨论】:

  • 在这一步之后我得到一个arrayoutofbounds异常然后我们想在这一步之后看看。
  • 你能发布异常吗?您发布的代码中没有数组,所以我会感到惊讶。
  • 线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:DESPrac.SBox 处的 298261(DESPrac.java:131)
  • @SotiriosDelimanolis 我的意思是在步骤结果中我得到了错误。这一步之后我没有别的东西了。
  • 您是否尝试过打印出您的索引值?它们显然超出了界限。

标签: java security hex long-integer bit


【解决方案1】:

您的问题是您传递给方法的值。 long testPassing=0x1234567887654321L; 大于 48 位整数 - 它实际上是 61 个有效位。因此,当您编写 int Sa=(int)((S&gt;&gt;42)); 时,您会得到具有 19 个有效位的东西。但是您正在使用它来索引您的数组,该数组可能只有 64 个条目,因为(根据代码中的 cmets),您正在查找其中的 6 位块。

如果您想忽略 long 的前 16 位,您可以编写 int Sa=(int)((S&gt;&gt;42)&amp;63);,它实际上会丢弃您尝试隔离的 6 位以外的所有内容。

【讨论】:

    【解决方案2】:

    所以你有八个数组

    byte Oa=S1Table[Sa];
    byte Ob=S2Table[Sb];
    byte Oc=S3Table[Sc];
    byte Od=S4Table[Sd];
    byte Oe=S5Table[Se];
    byte Of=S6Table[Sf];
    byte Og=S7Table[Sg];
    byte Oh=S8Table[Sh];
    

    Sh 的值是多少,确保您的 S8Table(和其他)是这个大小 - 我敢打赌它们不是。

    【讨论】:

      【解决方案3】:

      问题是我初始化的 long 值超过了 16。

      【讨论】:

      • 根据我的回答,S?Tables 不是只为 16 个数组初始化的吗?如果是,请接受我的回答
      • 您好,感谢您的意见。但不,不是。正是这个值有问题——long testPassing=0x1234567887654321L;
      • 对不起,我不明白你的问题,16 的相关性或你的输入值有什么。您的代码要么错误,要么不可靠,或者您仍未向我们展示完整的问题 - 我们该如何回答?
      • 看起来问题在于(int)((S&gt;&gt;42)) 将给出一个“22 位”有符号值。即使S 在未选中的 48 位限制内,负值仍然是 AIOBE。 /O 的分配看起来也很狡猾。中间结果是ints,它被重复分配给long。看起来像DES,不记得里面发生了什么。 / 你最好不要坚持 Java 编码约定。以大写 O 开头的变量名特别刺耳。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多