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

Source Code for Module lacewing.bytereader

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