用 Kerberos 为 J2ME 应用程序上锁,第 3 部分: 建立与电子银行的安全通信(上)
2010-03-30 00:00:00 来源:WEB开发网注意, getIntegerValue() 方法设计为只处理正的 integer 值。
ASN.1 以最高有效位优先(most-significant-byte-first)的序列存储一个正的 INTEGER 。例如,用 ASN.1 表示的十进制 511 就是 0x01 0xFF 。可以写出十进制值的完整位表示(对于 511 ,它是 1 11111111 ),然后对每一个字节写出 十六进制 值(对于 511,它是 0x01, 0xFF ),最后以最高有效位优先的顺序写出 十六进制 值。
另一方面,在 J2ME 中一个 int 总是四字节长,并且最低有效 字节 占据了最右边的位置。在正 integer 值中空出的位置上填入零。例如,对于 511 ,J2ME int 的写法是 0x00 0x00 0x01 0xFF 。
这意味着在将 ASN.1 INTEGER 转换为一个 J2ME int 时,必须将输入数组的每一个 字节 正确地放到输出 J2ME int 中的相应位置上。
例如,如果输入字节数组包含两个字节的数据 (0x01, 0xFF) ,那么必须像下面这样将这些字节放到输出 int 中:
必须在输出 int 的最左边或者最高有效位置写入 0x00 。
类似地,必须在与输出 int 的最高有效 字节 相邻的位置上写入 0x00 。
输入数组的第一个字节 (0x01) 放入输出 int 中与最低有效位置相邻的位置。
输出数组的第二个字节 (0xFF) 放到输出 int 的最低有效或者最右边的位置。
getIntegerValue() 方法中的 for 循环计算每一个 字节 的正确位置,再将这个 字节 拷贝到其相应的位置上。
还要注意因为 J2ME int 总是有四个字节, getIntegerValue() 方法只能处理最多四 字节 integer 值。能力有限的、基于 J2ME 的 Kerberos 客户不需要处理更大的值。
清单 3. getIntegerValue() 方法
public int getIntegerValue(byte[] intValueAsBytes)
{
int intValue = 0;
int i = intValueAsBytes.length;
for (int y = 0; y < i; y++)
intValue |= ((int)intValueAsBytes[y] & 0xff) << ((i-(y+1)) * 8);
return intValue;
}//getIntegerValue()
更多精彩
赞助商链接