Dưới đây là mã triển khai Checksum bằng Java:
Ví dụ
import java.util.*;
public class Demo{
public static void main(String args[]){
Scanner my_scan = new Scanner(System.in);
System.out.println("Nhập chuỗi đầu vào: ");
String my_in = my_scan.next();
int my_checksum = generate_checksum(my_in);
System.out.println("Checksum đã tạo: " + Integer.toHexString(my_checksum));
System.out.println("Nhập dữ liệu cần gửi đến người nhận: ");
my_in = my_scan.next();
System.out.println("Nhập checksum cần gửi đến người nhận: ");
my_checksum = Integer.parseInt((my_scan.next()), 16);
receive(my_in, my_checksum);
my_scan.close();
}
static int generate_checksum(String s){
String my_hex_val = new String();
int x, i, my_checksum = 0;
for (i = 0; i < s.length() - 2; i = i + 2){
x = (int) (s.charAt(i));
my_hex_val = Integer.toHexString(x);
x = (int) (s.charAt(i + 1));
my_hex_val = my_hex_val + Integer.toHexString(x);
System.out.println(s.charAt(i) + "" + s.charAt(i + 1) + " : " + my_hex_val);
x = Integer.parseInt(my_hex_val, 16);
my_checksum += x;
}
if (s.length() % 2 == 0){
x = (int) (s.charAt(i));
my_hex_val = Integer.toHexString(x);
x = (int) (s.charAt(i + 1));
my_hex_val = my_hex_val + Integer.toHexString(x);
System.out.println(s.charAt(i) + "" + s.charAt(i + 1) + " : " + my_hex_val);
x = Integer.parseInt(my_hex_val, 16);
} else {
x = (int) (s.charAt(i));
my_hex_val = "00" + Integer.toHexString(x);
x = Integer.parseInt(my_hex_val, 16);
System.out.println(s.charAt(i) + " : " + my_hex_val);
}
my_checksum += x;
my_hex_val = Integer.toHexString(my_checksum);
if (my_hex_val.length() > 4){
int carry = Integer.parseInt(("" + my_hex_val.charAt(0)), 16);
my_hex_val = my_hex_val.substring(1, 5);
my_checksum = Integer.parseInt(my_hex_val, 16);
my_checksum += carry;
}
my_checksum = generate_complement(my_checksum);
return my_checksum;
}
static void receive(String s, int my_checksum){
int gen_checksum = generate_checksum(s);
gen_checksum = generate_complement(gen_checksum);
int syndrome = gen_checksum + my_checksum;
syndrome = generate_complement(syndrome);
System.out.println("Giá trị syndrome: " + Integer.toHexString(syndrome));
if (syndrome == 0){
System.out.println("Dữ liệu nhận không lỗi");
} else {
System.out.println("Gặp lỗi trong dữ liệu nhận");
}
}
static int generate_complement(int my_checksum){
my_checksum = Integer.parseInt("FFFF", 16) - my_checksum;
return my_checksum;
}
}
Đầu vào
sample sample b2c8
Kết quả
Nhập chuỗi đầu vào sa : 7361 mp : 6d70 le : 6c65 Checksum đã tạo: b2c8 Nhập dữ liệu cần gửi đến người nhận Nhập checksum cần gửi đến người nhận sa : 7361 mp : 6d70 le : 6c65 Giá trị syndrome: 0 Dữ liệu nhận không lỗi
Lớp Demo chứa main. Instance Scanner định nghĩa, chuỗi đầu vào định nghĩa.
Hàm generate_checksum tạo instance String mới, khởi tạo checksum 0. Chuỗi truyền tham số duyệt qua, chuyển giá trị hex. Mỗi ký tự duyệt, chuyển int, rồi hex. Hex cộng với hex ký tự tiếp theo.
Nếu độ dài chuỗi chẵn, mỗi ký tự duyệt, chuyển int, hex, cộng hex ký tự tiếp. Ngược lại, nối với 00.
Hàm receive gọi generate_checksum truyền kết quả. Cộng với checksum gốc (ban đầu 0). Chuyển hex. Nếu độ dài > 4, tạo carry. Checksum gốc parse và cộng carry. Sau snippet, generate_complement gọi trên checksum. Hàm generate_complement trừ checksum từ FFFF hex.