Skip to content

Commit

Permalink
Merge pull request #36 from ewquon/f/update_BinaryFile
Browse files Browse the repository at this point in the history
Update BinaryFile class
  • Loading branch information
ewquon authored Jun 12, 2021
2 parents bb95893 + 44745d3 commit f18bbc1
Showing 1 changed file with 54 additions and 31 deletions.
85 changes: 54 additions & 31 deletions windtools/io/binary.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import struct


class BinaryFile:
class BinaryFile(object):
"""
Helper class for handling binary file I/O
"""
Expand Down Expand Up @@ -62,61 +62,84 @@ def unpack(self,*args):
except struct.error:
raise IOError

def read_char(self):
return self.f.read(1).decode('utf-8')
def read_char(self,encoding='utf-8'):
return self.f.read(1).decode(encoding)

def readline(self):
def readline(self,encoding='utf-8'):
s = ''
b = self.read_char()
b = self.read_char(encoding)
while not b in ['\n','']:
s += b
b = self.f.read(1).decode('utf-8')
b = self.read_char(encoding)
return s + b

# integers
# integer reads
def read_int1(self,N=1):
if N==1: return self.unpack('b',self.f.read(1))[0] #short
else: return self.unpack('{:d}b',self.f.read(N*1))[0:N] #short
if N==1:
return self.unpack('b',self.f.read(1))[0] #short
else:
return self.unpack('{:d}b',self.f.read(N*1))[0:N] #short
def read_int2(self,N=1):
if N==1: return self.unpack('h',self.f.read(2))[0] #short
else: return self.unpack('{:d}h'.format(N),self.f.read(N*2))[0:N] #short
if N==1:
return self.unpack('h',self.f.read(2))[0] #short
else:
return self.unpack('{:d}h'.format(N),self.f.read(N*2))[0:N] #short
def read_int4(self,N=1):
if N==1: return self.unpack('i',self.f.read(4))[0] #int
else: return self.unpack('{:d}i'.format(N),self.f.read(N*4))[0:N] #int
if N==1:
return self.unpack('i',self.f.read(4))[0] #int
else:
return self.unpack('{:d}i'.format(N),self.f.read(N*4))[0:N] #int
def read_int8(self,N=1):
if N==1: return self.unpack('l',self.f.read(8))[0] #long
else: return self.unpack('{:d}l'.format(N),self.f.read(N*8))[0:N] #long
if N==1:
return self.unpack('l',self.f.read(8))[0] #long
else:
return self.unpack('{:d}l'.format(N),self.f.read(N*8))[0:N] #long
def read_int(self,N=1):
return self.read_int4(N)

# floats
# float reads
def read_float(self,N=1,dtype=float):
if N==1: return dtype( self.unpack('f',self.f.read(4))[0] )
else: return [ dtype(val) for val in self.unpack('{:d}f'.format(N),self.f.read(N*4))[0:N] ]
if N==1:
return dtype( self.unpack('f',self.f.read(4))[0] )
else:
return [ dtype(val) for val in self.unpack('{:d}f'.format(N),self.f.read(N*4))[0:N] ]
def read_double(self,N=1):
if N==1: return self.unpack('d',self.f.read(8))[0]
else: return self.unpack('{:d}d'.format(N),self.f.read(N*8))[0:N]
if N==1:
return self.unpack('d',self.f.read(8))[0]
else:
return self.unpack('{:d}d'.format(N),self.f.read(N*8))[0:N]
def read_real4(self,N=1):
return self.read_float(N,dtype=np.float32)
def read_real8(self,N=1):
return self.read_float(N,dtype=np.float64)

# binary output
def write(self,val,encoding='utf-8'):
if isinstance(val,str):
self.f.write(val.encode(encoding))
else:
self.f.write(val)

def write_type(self,val,type):
if hasattr(val,'__iter__'):
N = len(val)
self.f.write(struct.pack('{:d}{:s}'.format(N,type),*val))
else:
self.f.write(struct.pack(type,val))


# aliases
def read_int(self,N=1): return self.read_int4(N)

def write_int1(self,val): self.write_type(val,'b')
def write_int2(self,val): self.write_type(val,'h')
def write_int4(self,val): self.write_type(val,'i')
def write_int8(self,val): self.write_type(val,'l')

def write_int(self,val): self.write_int4(val)
def write_float(self,val): self.write_type(val,'f')
def write_double(self,val): self.write_type(val,'d')
def write_int(self,val):
self.write_int4(val)
def write_int1(self,val):
self.write_type(val,'b')
def write_int2(self,val):
self.write_type(val,'h')
def write_int4(self,val):
self.write_type(val,'i')
def write_int8(self,val):
self.write_type(val,'l')
def write_float(self,val):
self.write_type(val,'f')
def write_double(self,val):
self.write_type(val,'d')

0 comments on commit f18bbc1

Please sign in to comment.