-
Notifications
You must be signed in to change notification settings - Fork 251
/
IBAN.java
115 lines (101 loc) · 3.5 KB
/
IBAN.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package com.ethjava;
import java.math.BigInteger;
import java.text.Format;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import static java.lang.Integer.parseInt;
public class IBAN {
/**
* 根据官方支持的IBAN规则生成二维码 目前支持的有imtoken kcash
* 参考url
* https://github.com/ethereum/web3.js/blob/develop/lib/web3/iban.js
* 可以防止地址错误(有两位校验和)
*/
public static void main(String[] args) {
getIBAN();
}
public static void getIBAN() {
String address = "0xaaae432f77a74a33c5e5b47612dabef44a905de6".toLowerCase();
System.out.println(address);
address = address.substring(2);
BigInteger value = new BigInteger(address, 16);
StringBuilder bban = new StringBuilder(value.toString(36).toUpperCase());
while (bban.length() < 15 * 2) {
bban.insert(0, '0');
}
System.out.println("bban " + bban);
String iban = "XE00" + bban;
iban = iban.substring(4) + iban.substring(0, 4);
StringBuilder code = new StringBuilder();
for (int i = 0; i < iban.length(); i++) {
char chr = iban.charAt(i);
if (chr >= 'A' && chr <= 'Z') {
int temp = chr - 'A' + 10;
code.append(String.valueOf(temp));
} else {
code.append(String.valueOf((chr - '0')));
}
}
// System.out.println(code);
String remainder = code.toString();
String block;
while (remainder.length() > 2) {
int endPoint = remainder.length() >= 9 ? 9 : remainder.length();
block = remainder.substring(0, endPoint);
remainder = parseInt(block, 10) % 97 + remainder.substring(block.length());
// System.out.println(remainder);
}
int checkNum = parseInt(remainder, 10) % 97;
String checkDigit = ("0" + (98 - checkNum));
checkDigit = checkDigit.substring(checkDigit.length() - 2);
// System.out.println(checkDigit);
String IBAN = "XE" + checkDigit + bban;
String qrCodeString = "iban:" + IBAN + "?token=ETH&amount=5";
System.out.println("IBAN " + IBAN);
System.out.println("验证 " + validateIBAN(IBAN));
System.out.println("qrcode " + qrCodeString);
decodeQRString(qrCodeString);
}
private static boolean validateIBAN(String iban) {
int len = iban.length();
if (len < 4 || !iban.matches("[0-9A-Z]+"))
return false;
iban = iban.substring(4) + iban.substring(0, 4);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < len; i++)
sb.append(Character.digit(iban.charAt(i), 36));
BigInteger bigInt = new BigInteger(sb.toString());
return bigInt.mod(BigInteger.valueOf(97)).intValue() == 1;
}
private static void decodeQRString(String result) {
int ibanEndpoint = result.indexOf("?");
String iban = result.substring(5, ibanEndpoint < 0 ? result.length() : ibanEndpoint);
String address = IBAN2Address(iban);
String query = result.substring(ibanEndpoint + 1, result.length());
String[] params = query.split("&");
String token = null;
String amount = null;
for (String param : params) {
if (param.startsWith("token=")) {
token = param.substring(6);
continue;
}
if (param.startsWith("amount=")) {
amount = param.substring(7);
}
}
System.out.println("decodeQRString");
System.out.println("address " + address);
System.out.println("token " + token);
System.out.println("amount " + address);
}
private static String IBAN2Address(String iban) {
String base36 = iban.substring(4);
StringBuilder base16 = new StringBuilder(new BigInteger(base36, 36).toString(16));
while (base16.length() < 40) {
base16.insert(0, "0");
}
return "0x" + base16.toString().toLowerCase();
}
}