以太坊转账二维码 iban 生成

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