Package lacewing :: Module bytereader
[frames] | no frames]

Source Code for Module lacewing.bytereader

  1  """ 
  2  Implements a way to easily read and write binary types 
  3  """ 
  4   
  5  from cStringIO import StringIO 
  6  import struct 
  7   
  8  BYTE = struct.Struct('b') 
  9  UBYTE = struct.Struct('B') 
 10  SHORT = struct.Struct('h') 
 11  USHORT = struct.Struct('H') 
 12  FLOAT = struct.Struct('f') 
 13  INT = struct.Struct('i') 
 14  UINT = struct.Struct('I') 
 15   
16 -class ByteReader(object):
17 buffer = None 18
19 - def __init__(self, input = None):
20 """ 21 @param input: The input to initially fill the reader with 22 @type input: file/str/buffer 23 """ 24 if isinstance(input, file): 25 buffer = input 26 self.write = buffer.write 27 else: 28 if input is not None: 29 buffer = StringIO(input) 30 else: 31 buffer = StringIO() 32 self.write = buffer.write 33 self.data = buffer.getvalue 34 35 self.buffer = buffer 36 self.tell = buffer.tell
37
38 - def data(self):
39 currentPosition = self.tell() 40 self.seek(0) 41 data = self.read() 42 self.seek(currentPosition) 43 return data
44
45 - def seek(self, *arg, **kw):
46 self.buffer.seek(*arg, **kw)
47
48 - def read(self, *arg, **kw):
49 return self.buffer.read(*arg, **kw)
50
51 - def size(self):
52 currentPosition = self.tell() 53 self.seek(0, 2) 54 size = self.tell() 55 self.seek(currentPosition) 56 return size
57
58 - def __len__(self):
59 return self.size()
60
61 - def __str__(self):
62 return self.data()
63
64 - def __repr__(self):
65 return repr(str(self))
66
67 - def readByte(self, unsigned = False):
68 format = UBYTE if unsigned else BYTE 69 value, = self.readStruct(format) 70 return value
71
72 - def readShort(self, unsigned = False):
73 format = USHORT if unsigned else SHORT 74 value, = self.readStruct(format) 75 return value
76
77 - def readFloat(self):
78 value, = self.readStruct(FLOAT) 79 return value
80
81 - def readInt(self, unsigned = False):
82 format = UINT if unsigned else INT 83 value, = self.readStruct(format) 84 return value
85
86 - def readString(self):
87 currentPosition = self.tell() 88 store = '' 89 while 1: 90 readChar = self.read(1) 91 if readChar in ('\x00', ''): 92 break 93 store = ''.join([store, readChar]) 94 return store
95
96 - def readStruct(self, structType):
97 return structType.unpack(self.read(structType.size))
98
99 - def writeByte(self, value, unsigned = False):
100 format = UBYTE if unsigned else BYTE 101 self.writeStruct(format, value)
102
103 - def writeShort(self, value, unsigned = False):
104 format = USHORT if unsigned else SHORT 105 self.writeStruct(format, value)
106
107 - def writeFloat(self, value):
108 self.writeStruct(FLOAT, value)
109
110 - def writeInt(self, value, unsigned = False):
111 format = UINT if unsigned else INT 112 self.writeStruct(format, value)
113
114 - def writeString(self, value):
115 self.write(value + "\x00")
116
117 - def writeStruct(self, structType, *values):
118 self.write(structType.pack(*values))
119