Exercise
Enhance your understanding of checksums by getting hands-on practice with the exercise provided in this lesson!
We'll cover the following...
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
-
First just run
checksum.pywith no arguments. Compute the additive, XOR-based, and Fletcher checksums. Use-cto check your answers. -
Now do the same, but vary the seed (
-s) to different values. -
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
-Dflag, 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 ...