The actual procedure which yields the checksum, given a data input is called a checksum function or checksum algorithm. Depending on its design goals, a good checksum algorithm will usually output a significantly different value, even for small changes made to the input. This is especially true of cryptographic hash functions, which may be used to detect many data corruption errors and verify overall data integrity; if the computed checksum for the current data input matches the stored value of a previously computed checksum, there is a very high probability the data has not been accidentally altered or corrupted.
Here is the source code of the Java Program to Implement the Checksum Method for Small String Messages and Detect If the Received message is same as the Transmitted. The Java program is successfully compiled and run on a Windows system. The program output is also shown below.
package com.sanfoundry.setandstring;
import java.util.*;
public class ChecksumMethod
{
public static void main(String args[])
{
Scanner scan = new Scanner(System.in);
System.out.println("Enter the string input:");
String input = scan.next();
int checksum = generateChecksum(input);
// Call the method to create the checksum
System.out.println("The checksum generated is = "
+ Integer.toHexString(checksum));
System.out.println("Enter the data to be sent:");
input = scan.next();
System.out.println("Enter the checksum to be sent:");
checksum = Integer.parseInt((scan.next()), 16);
// User inputs data as hexadecimal value but it will be stored as a
// decimal value unless it is converted into hexadecimal first.
receive(input, checksum);
scan.close();
}
static int generateChecksum(String s)
{
String hex_value = new String();
// 'hex_value' will be used to store various hex values as a string
int x, i, checksum = 0;
// 'x' will be used for general purpose storage of integer values
// 'i' is used for loops
// 'checksum' will store the final checksum
for (i = 0; i < s.length() - 2; i = i + 2)
{
x = (int) (s.charAt(i));
hex_value = Integer.toHexString(x);
x = (int) (s.charAt(i + 1));
hex_value = hex_value + Integer.toHexString(x);
// Extract two characters and get their hexadecimal ASCII values
System.out.println(s.charAt(i) + "" + s.charAt(i + 1) + " : "
+ hex_value);
x = Integer.parseInt(hex_value, 16);
// Convert the hex_value into int and store it
checksum += x;
// Add 'x' into 'checksum'
}
if (s.length() % 2 == 0)
{
// If number of characters is even, then repeat above loop's steps
// one more time.
x = (int) (s.charAt(i));
hex_value = Integer.toHexString(x);
x = (int) (s.charAt(i + 1));
hex_value = hex_value + Integer.toHexString(x);
System.out.println(s.charAt(i) + "" + s.charAt(i + 1) + " : "
+ hex_value);
x = Integer.parseInt(hex_value, 16);
}
else
{
// If number of characters is odd, last 2 digits will be 00.
x = (int) (s.charAt(i));
hex_value = "00" + Integer.toHexString(x);
x = Integer.parseInt(hex_value, 16);
System.out.println(s.charAt(i) + " : " + hex_value);
}
checksum += x;
// Add the generated value of 'x' from the if-else case into 'checksum'
hex_value = Integer.toHexString(checksum);
// Convert into hexadecimal string
if (hex_value.length() > 4)
{
// If a carry is generated, then we wrap the carry
int carry = Integer.parseInt(("" + hex_value.charAt(0)), 16);
// Get the value of the carry bit
hex_value = hex_value.substring(1, 5);
// Remove it from the string
checksum = Integer.parseInt(hex_value, 16);
// Convert it into an int
checksum += carry;
// Add it to the checksum
}
checksum = generateComplement(checksum);
// Get the complement
return checksum;
}
static void receive(String s, int checksum)
{
int generated_checksum = generateChecksum(s);
// Calculate checksum of received data
generated_checksum = generateComplement(generated_checksum);
// Then get its complement, since generated checksum is complemented
int syndrome = generated_checksum + checksum;
// Syndrome is addition of the 2 checksums
syndrome = generateComplement(syndrome);
// It is complemented
System.out.println("Syndrome = " + Integer.toHexString(syndrome));
if (syndrome == 0)
{
System.out.println("Data is received without error.");
}
else
{
System.out.println("There is an error in the received data.");
}
}
static int generateComplement(int checksum)
{
// Generates 15's complement of a hexadecimal value
checksum = Integer.parseInt("FFFF", 16) - checksum;
return checksum;
}
}
Output:
$ javac ChecksumMethod.java $ java ChecksumMethod Enter the string input: Sanfoundry Sa : 5361 nf : 6e66 ou : 6f75 nd : 6e64 ry : 7279 The checksum generated is = ede4 Enter the data to be sent: Sanfoundry Enter the checksum to be sent: ede4 Sa : 5361 nf : 6e66 ou : 6f75 nd : 6e64 ry : 7279 Syndrome = 0 Data is received without error. Enter the string input: Sanfoundry Sa : 5361 nf : 6e66 ou : 6f75 nd : 6e64 ry : 7279 The checksum generated is = ede4 Enter the data to be sent: sanfoundry Enter the checksum to be sent: ede4 sa : 7361 nf : 6e66 ou : 6f75 nd : 6e64 ry : 7279 Syndrome = ffffe000 There is an error in the received data.
Sanfoundry Global Education & Learning Series – 1000 Java Programs.
Here’s the list of Best Books in Java Programming, Data Structures and Algorithms.
- Practice Information Technology MCQs
- Practice BCA MCQs
- Check Java Books
- Check Programming Books
- Practice Programming MCQs