Just another WordPress weblog
25 Jan
Tahun 2007, Alhamdullilah dapat pengalaman baru di salah satu airline operator untuk membuat sistem gapura ISO-8583 untuk mengakomodasi pembayaran on-line lewat bank. Dengan gapura ini, memungkinkan calon penumpang yang sudah reservasi lewat internet, untuk melakukan pembayarannya lewat media-media bank, seperti ATM, teller, SMS banking, atau internet banking.
Sebenarnya, tidak banyak kendala untuk membuat sistem tersebut, karena sudah pernah membangun sistem yang serupa untuk salah satu operator selular CDMA. Bedanya, sistem sebelumnya dibangun untuk mengakomodasi pembelian voucher elektronik dan pembayaran tagihan pasca-bayar.
Tricky nya, kode reservasi untuk payment di sistem airline ini strukturnya terdiri dari 6-karakter alpha-numerik. Sedangkan, keyboard ATM hanya ada tuts numerik dan jumlah maksimum numerik yang bisa dimasukkan adalah 10-digit. Jadi, perlu ada fungsi konversi dari 6-karakter alpha-numerik ke 10-digit numerik, bolak-balik.
Perlu semedi seharian sampai akhirnya dapat wangsit kalau teknik konversi antara HEX (Basis-16) dan DECIMAL (Basis-10) bisa dipakai untuk menyelesaikan masalah ini. Dan untungnya, gua ngga’ tidur waktu pelajaran matematika SMP
Alpha-numerik di sini terdiri dari 36 karakter, 0~9, A~Z. Dengan maksimum panjang kode 6-karakter, berarti ada 36^6 = 2176782336 kemungkinan, … ya, betul …10-digit numerik, convinient right ?
Langkah selanjutnya, perlu ada metode untuk memberi nilai numerik untuk karakter A~Z. Seperti halnya di HEX, A diberikan nilai 10, B = 11, … F = 15, begitu juga untuk basis-36 di sini. Cara termudah adalah dengan index posisi, misalnya jejerkan semua alpha-numerik seperti berikut :
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
, berarti : A = 10, B = 11, …, Z = 35. Jika urutan di atas di acak, mungkin akan bisa memberikan tingkat enkripsi yang lebih.
Selanjutnya, untuk konversi dari Basis-10 ke Basis-36, tinggal memakai operasi modulus, berikut source code nya dalam Java :
private String convertToBase36 (long base10) {
String map = “0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”;
String res = “”;
LinkedList list = new LinkedList();long sisa = 0;
do {
sisa = base10 % 36;
list.addFirst(String.valueOf(sisa));base10 = (base10 - sisa) / 36;
} while(base10 >= 36);list.addFirst(String.valueOf(base10));
for (int i=0;i<list.size();i++) {
int pos = Integer.parseInt((String)list.get(i));
res += map.charAt(pos); //index posisi
}
return res.toUpperCase();
}
Dan sebaliknya, untuk konversi dari 6-karakter Basis-36 ke Basis-10 :
private long convertToBase10 (String base36) {
String map = “0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”;
base36 = base36.toUpperCase();
long res = 0;for (int i=0;i<6;i++) { // 6-karakter
//index posisi
res += (Math.pow(36, (5 - i)) * map.indexOf(base36.charAt(i)));
}
return res;
}
Math, rocks !!
Leave a reply