Skip to content

Commit 821de4f

Browse files
committed
Simplified D64 test, minor refactoring of D64
Old test would have failed with duplicate items in the test data.
1 parent d409b22 commit 821de4f

2 files changed

Lines changed: 19 additions & 23 deletions

File tree

src/bd2k/util/d64.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@
2323
class D64( object ):
2424
def __init__( self, special_chars ):
2525
super( D64, self ).__init__( )
26-
self.chars = bytearray( sorted(
27-
'PYFGCRLAOEUIDHTNSQJKXBMWVZpyfgcrlaoeuidhtnsqjkxbmwvz1234567890' + special_chars ) )
28-
self.codeToIndex = bytearray( 128 )
26+
alphabet = 'PYFGCRLAOEUIDHTNSQJKXBMWVZpyfgcrlaoeuidhtnsqjkxbmwvz1234567890'
27+
self.alphabet = bytearray( sorted( alphabet + special_chars ) )
28+
self.lookup = bytearray( 255 )
2929
for i in xrange( 64 ):
30-
code = self.chars[ i ]
31-
self.codeToIndex[ code ] = i
30+
code = self.alphabet[ i ]
31+
self.lookup[ code ] = i
3232

3333
def encode( self, data ):
3434
"""
@@ -48,32 +48,32 @@ def encode( self, data ):
4848
s = bytearray( (l * 4 + 2) / 3 )
4949
hang = 0
5050
j = 0
51-
chars = self.chars
51+
a = self.alphabet
5252
for i in xrange( l ):
5353
v = ord( data[ i ] )
5454
r = i % 3
5555
if r == 0:
56-
s[ j ] = chars[ v >> 2 ]
56+
s[ j ] = a[ v >> 2 ]
5757
j += 1
5858
hang = (v & 3) << 4
5959
elif r == 1:
60-
s[ j ] = chars[ hang | v >> 4 ]
60+
s[ j ] = a[ hang | v >> 4 ]
6161
j += 1
6262
hang = (v & 0xf) << 2
6363
elif r == 2:
64-
s[ j ] = chars[ hang | v >> 6 ]
64+
s[ j ] = a[ hang | v >> 6 ]
6565
j += 1
66-
s[ j ] = chars[ v & 0x3f ]
66+
s[ j ] = a[ v & 0x3f ]
6767
j += 1
6868
hang = 0
6969
else:
7070
assert False
7171
if l % 3:
72-
s[ j ] = chars[ hang ]
72+
s[ j ] = a[ hang ]
7373

7474
return str( s )
7575

76-
def decode( self, s ):
76+
def decode( self, e ):
7777
"""
7878
>>> decode = standard.decode
7979
>>> decode('')
@@ -87,14 +87,14 @@ def decode( self, s ):
8787
>>> decode('..31.kF40VR')
8888
'\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07'
8989
"""
90-
l = len( s )
90+
n = len( e )
9191
j = 0
92-
b = bytearray( l * 3 / 4 )
92+
b = bytearray( n * 3 / 4 )
9393
hang = 0
94-
codeToIndex = self.codeToIndex
94+
l = self.lookup
9595

96-
for i in xrange( l ):
97-
v = codeToIndex[ ord( s[ i ] ) ]
96+
for i in xrange( n ):
97+
v = l[ ord( e[ i ] ) ]
9898
r = i % 4
9999
if r == 0:
100100
hang = v << 2

src/bd2k/util/test/test_d64.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,5 @@
2626

2727
class TestD64( TestCase ):
2828
def test( self ):
29-
data = [ (os.urandom( i ), i) for i in xrange( 1000 ) ]
30-
encoded_data = [ (d64.encode( d ), i) for d, i in data ]
31-
decoded_data = [ (d64.decode( s ), i) for s, i in encoded_data ]
32-
self.assertEqual( data, decoded_data )
33-
# Ensure that lexicographical sort is consistent between data and encoded data
34-
self.assertEqual( zip( *sorted( data ) )[ 1 ], zip( *sorted( encoded_data ) )[ 1 ] )
29+
l = [ os.urandom( i ) for i in xrange( 1000 ) ]
30+
self.assertEqual( map( d64.decode, sorted( map( d64.encode, l ) ) ), sorted( l ) )

0 commit comments

Comments
 (0)