【发布时间】:2014-10-08 16:42:55
【问题描述】:
在使用一些代码库时,我试图理解一段代码以便可以工作和自定义它,我能够理解几乎 90% 的代码流。这是整体流程
- 代码用于生成 15 位代码(字母数字),前 3 位是客户提供的。
- 最初代码生成 16 位字母数字并将其存储在缓存中。
- 客户可以通过指定数量生成任意数量的代码。
- 所有客户生成的代码都是从 16 位数字生成的(第 2 点)。生成的所有代码都包含来自该 16 位字母数字的数字/字母。
- 当有人尝试使用这些代码时,系统会尝试验证提供的代码是否有效。
我对用于确定提供的代码是否有效的逻辑感到震惊,这是那段代码,我正在生成 6 个代码作为示例,在这种情况下,生成并存储在缓存中的字母数字代码是
initial-alphabet : M9W6K3TENDGSFAL4
基于initial-alphabet生成的代码是
myList=[123-MK93-ES6D-36F3, 123-MK93-EFTW-D3LG, 123-MK93-EALK-TGLD, 123-MK93-ELKK-DN6S, 123-MK93-E4D9-3A6T, 123-MK93-EMTW-LNME]
protected int getVoucherNumber(String voucherCode){
int voucherNumberPos = voucherCode.length() - 12;
String voucherNumberHex = voucherCode.substring(voucherNumberPos, voucherNumberPos + 6);
int firstByte = getIntFromHexByte(voucherNumberHex.substring(0, 2), 0);
int secondByte = getIntFromHexByte(voucherNumberHex.substring(2, 4), 1);
int thirdByte = getIntFromHexByte(voucherNumberHex.substring(4, 6), 7);
return firstByte << 16 | secondByte << 8 | thirdByte;
}
private int getIntFromHexByte(String value, int offset){
return (getIntFromHexNibble(value.charAt(0), offset) << 4) + getIntFromHexNibble(value.charAt(1), offset + 4);
}
private int getIntFromHexNibble(char value, int offset){
int pos = getAlphabet().indexOf(value);
if (pos == -1) {// nothing found}
pos -= offset;
while (pos < 0) {
pos += 16;
}
return pos % 16;
}
这是试图验证代码的代码
int voucherNumber = getVoucherNumber(kyList.get(4));
在这种情况下voucherNumber 的值是4 即列表中的第四个元素,以防我传递任何不属于列表的值getVoucherNumber 方法返回一个更高的值(大于列表计数)。
让我困惑的主要事情之一是这两行
int voucherNumberPos = voucherCode.length() - 12;
String voucherNumberHex = voucherCode.substring(voucherNumberPos, voucherNumberPos + 6);
据我了解,他们首先从客户提供的支票中移出前 3 位数字,但他们再次没有使用字符串的其余部分,而只使用了字符串的特定部分。
谁能帮我理解这个
【问题讨论】:
-
为什么标记为
java8?此代码示例中是否有关于 Java 8 的特定内容?我没有看到它,但也许我错过了它...... -
@FrustratedWithFormsDesigner:与java-8无关,我标记错了,谢谢指正