我有一个函数,它以一个长值作为输入,并返回一个长值。
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);在这一步之后,我得到了一个arrayoutof界异常。
任何帮助都将不胜感激!!谢谢。
发布于 2014-10-15 10:25:01
您的问题是要传递给方法的值。long testPassing=0x1234567887654321L;大于48位整数,实际上是61位重要位。因此,当您编写int Sa=(int)((S>>42));时,您会得到一些有19个重要位的信息。但是您使用它来索引数组,该数组大概只有64个条目,因为(根据代码中的注释),您正在查找其中的6位块。
如果您想忽略long的前16位,您可以编写int Sa=(int)((S>>42)&63);,它有效地丢弃了除您试图隔离的6位之外的其他所有内容。
发布于 2013-12-04 04:09:11
所以你有八个数组
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 (和其他的)是这样的大小-我打赌他们不是。
发布于 2013-12-04 04:16:05
问题是,我初始化的长值大于16。
https://stackoverflow.com/questions/20366549
复制相似问题