最近发现好多的以太坊钱包的转账二维码 扫描出来都是 iban开头的所以小小的研究了一下
说到IBAN就需要先了解下国际银行帐号(IBAN)
地址 https://en.wikipedia.org/wiki/International_Bank_Account_Number#Validating_the_IBAN
生成的地址 例如扫码之后的结果 iban:XE56******************?amount=0&token=ETH
?之后的无视掉 前四位XE56其实是一部分 后边的31位是一部分
后边的31位很好理解 钱包地址的36进制 所以这里主要来说一下前边的XE56怎么来的
XE56 中的XE其实也是写死的 只有56是计算出来的 好了说了这么多 下边开始开始吧
上边是维基百科的介绍
首先先把地址转化为36进制 然后前边拼接商XE00(是零不是O)此处要注意地址转换为36进制之后的位数 不够的在前边补零
address= XE00******************
public static String ibanChecksum(String address) {
//此处方法 是根据OC的转义过来的
String[] ibanLookup = new String[256];
for (int i = 0; i < 256; i++) {
ibanLookup[i] = "-";
}
for (int i = 0; i < 10; i++) {
ibanLookup['0' + i] = "" + i;
}
for (int i = 0; i < 26; i++) {
ibanLookup['A' + i] = "" + 10 + i;
}
//将前四位放到后边
address=address.substring(4,address.length())+"XE00";
long total = 0;
//将字符转换为数字 在此以后的都是摘自 https://github.com/arturmkrtchyan/iban4j 里的方法 在实际开发中大家可以自己写一下 我懒癌晚期 就直接用别人的了
for (int i = 0; i < address.length(); i++) {
final int numericValue = Character.getNumericValue(address.charAt(i));
if (numericValue < 0 || numericValue > 35) {
throw new IbanFormatException(IBAN_VALID_CHARACTERS, null, null,
address.charAt(i),
String.format("Invalid Character[%d] = '%d'", i, numericValue));
}
total = (numericValue > 9 ? total * 100 : total * 10) + numericValue;
if (total > MAX) {
total = (total % MOD);
}
}
int modResult=(int) (total % MOD);
int checkDigitIntValue = (98 - modResult);
final String checkDigit = Integer.toString(checkDigitIntValue);
return checkDigitIntValue > 9 ? checkDigit : "0" + checkDigit;
}