最近发现好多的以太坊钱包的转账二维码 扫描出来都是 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;
}