home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 12135 / WWF_RAW_FML_python_script.7z / control.py next >
Encoding:
Python Source  |  2016-12-22  |  3.4 KB  |  114 lines

  1. import binascii
  2. import numpy
  3. import struct
  4. import binary16
  5.  
  6. def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
  7.     return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
  8.  
  9. class hex_file(object):
  10.     def __init__(self, fileobj, endianess = 'little'):
  11.         self.fileobj   = fileobj
  12.         if type(self.fileobj) == file and self.fileobj.mode != "rb+":
  13.             print "Warning: rb+ mode not specified"
  14.         self.endianess = endianess
  15.         self.fileobj.seek(0)
  16.         self.data      = bytearray(self.fileobj.read())
  17.         return
  18.         
  19.     def read_int(self, offset, size):
  20.         a = self.data[offset:offset+size]
  21.         if self.endianess == 'little':
  22.             a = a[::-1]
  23.         b = binascii.hexlify(a)
  24.         return int(b, 16)
  25.     
  26.     def read_float(self, offset, size):
  27.         a = self.data[offset:offset+size]
  28.         if self.endianess == 'big':
  29.             a = a[::-1]
  30.         if size == 2:
  31.             return numpy.frombuffer(a, '<f2')[0]
  32.         elif size == 4:
  33.             return struct.unpack('<f', a)[0]
  34.         elif size == 8:
  35.             return struct.unpack('<d', a)[0]
  36.         else:
  37.             raise AssertionError, "Size of float must be 2,4 or 8 bytes"
  38.             
  39.     def read_string(self, offset, size):
  40.         return str(self.data[offset:offset+size])
  41.     
  42.     def write_string(self, offset, str):
  43.         self.data[offset:offset+len(str)] = str
  44.         return
  45.        
  46.     def write_int(self, offset, number, size):
  47.         hex_string = self.int_to_string(number, size)
  48.         self.data[offset:offset+size] = hex_string
  49.         return
  50.         
  51.     def delete_string(self, offset, size):
  52.         del self.data[offset:offset+size]
  53.         return
  54.     
  55.     def insert_string(self, offset, str):
  56.         for x in str[::-1]:
  57.             self.data.insert(offset, x)
  58.         return
  59.     
  60.     def find_float(self, value,size=4, precision=None, from_=0, to=None, step=1):
  61.         if to is None:
  62.             to = len(self.data)
  63.         for x in xrange(from_, to , step):
  64.             if (x+size) <= to:
  65.                 data = self.read_float(x, size)
  66.                 if precision is not None:
  67.                     data = round(data, precision)
  68.                 if data == value:
  69.                     return x
  70.             else:
  71.                 return -1
  72.         return -1
  73.             
  74.     def update(self):
  75.         self.fileobj.seek(0)
  76.         self.fileobj.truncate()
  77.         self.fileobj.write(self.data)
  78.         self.fileobj.flush()
  79.         return
  80.     
  81.     def reset(self):
  82.         self.fileobj.seek(0)
  83.         self.data      = bytearray(self.fileobj.read())
  84.         return
  85.         
  86.     def close(self):
  87.         self.fileobj.close()
  88.         return
  89.         
  90.     def int_to_string(self, number, size):
  91.         size = size * 2
  92.         a = "%c" % 0x25 
  93.         c = "."
  94.         d = "%d" % size
  95.         e = "X"
  96.         f = (a + c + d + e) % number
  97.         b = binascii.unhexlify(f)
  98.         if self.endianess == 'little':
  99.             b = b[::-1]
  100.         return b
  101.  
  102.     def float_to_string(self, number, size):
  103.         if size == 2:
  104.             b = binary16.binary16(number)
  105.         if size == 4:
  106.             b = struct.pack("<f", number)
  107.         elif size == 8:
  108.             b = struct.pack("<d", number) 
  109.         else:
  110.             raise AssertionError, "Size of float must be 2,4 or 8 bytes"
  111.         if self.endianess == 'big':
  112.             b = b[::-1]
  113.         return b    
  114.