Search⌘ K

Exercise

Explore how to use and implement various checksum methods such as additive, XOR, Fletcher, and CRC to verify data integrity. Learn to detect errors and corruption in files through practical coding exercises and performance comparisons, enhancing your understanding of persistence protection.

We'll cover the following...

Simulator

In this exercise, you’ll use checksum.py to investigate various aspects of checksums.

#! /usr/bin/env python

import random
from optparse import OptionParser

def print_hex(v):
    if v < 16:
        return '0x0%x' % v
    else:
        return '0x%x' % v
    
def print_bin(word):
    v = bin(word)
    o = '0b'
    o += ('0' * (10 - len(str(v))))
    o += str(v)[2:]
    return o
    

parser = OptionParser()
parser.add_option('-s', '--seed', default='0', help='Random seed',
                  action='store', type='int', dest='seed')
parser.add_option('-d', '--data_size', default='4',
                  help='Number of bytes in data word',
                  action='store', type='int', dest='data_size')
parser.add_option('-D', '--data', default='',
                  help='Data in comma separated form',
                  action='store', type='string', dest='data')
parser.add_option('-c', '--compute', help='compute answers for me',
                  action='store_true', default=False, dest='solve')
(options, args) = parser.parse_args()

print ''
print 'OPTIONS seed', options.seed
print 'OPTIONS data_size', options.data_size
print 'OPTIONS data', options.data
print ''

random.seed(options.seed)

values = []
if options.data != '':
    tmp = options.data.split(',')
    for t in tmp:
        values.append(int(t))
else:
    for t in range(int(options.data_size)):
        values.append(int(random.random() * 256))



add = 0
xor = 0
fletcher_a, fletcher_b = 0, 0

for value in values:
    add = (add + value) % 256
    xor = xor ^ value
    fletcher_a = (fletcher_a + value) % 255
    fletcher_b = (fletcher_b + fletcher_a) % 255

print 'Decimal:  ', 
for word in values:
    print '%10s' % str(word),
print ''

print 'Hex:      ', 
for word in values:
    print '     ', print_hex(word),
print ''

print 'Bin:      ', 
for word in values:
    print print_bin(word),
print ''

print ''
if options.solve:
    print 'Add:           ', '%3d      ' % add, '(%s)' % print_bin(add)
    print 'Xor:           ', '%3d      ' % xor, '(%s)' % print_bin(xor)
    print 'Fletcher(a,b): ', '%3d,%3d  ' % (fletcher_a, fletcher_b), '(%s,%s)' % (print_bin(fletcher_a), print_bin(fletcher_b))
else:
    print 'Add:      ?'
    print 'Xor:      ?'
    print 'Fletcher: ?'
print ''
    


Simulator

Questions

  1. First just run checksum.py with no arguments. Compute the additive, XOR-based, and Fletcher checksums. Use -c to check your answers.

  2. Now do the same, but vary the seed (-s) to different values.

  3. Sometimes the additive and XOR-based checksums produce the same checksum (e.g., if the data value is all zeroes). Can you pass in a 4-byte data value (using the -D flag, e.g., -D a,b,c,d) that does not contain only zeroes and leads the additive and XOR-based checksum having the same value? In general, when does this occur? Check that you are ...