reader: add unsigned integer types
This commit is contained in:
parent
4eb3dc8407
commit
97de4a5f78
@ -1,7 +1,7 @@
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from .record import *
|
from .record import *
|
||||||
import abc
|
import abc
|
||||||
|
import ctypes
|
||||||
|
|
||||||
class ProgressGetter(object, metaclass=abc.ABCMeta):
|
class ProgressGetter(object, metaclass=abc.ABCMeta):
|
||||||
@abc.abstractproperty
|
@abc.abstractproperty
|
||||||
@ -40,20 +40,36 @@ class Reader(ProgressGetter):
|
|||||||
def skip(self, n):
|
def skip(self, n):
|
||||||
self.stream.read(n)
|
self.stream.read(n)
|
||||||
|
|
||||||
def read_int(self):
|
def read_uint(self):
|
||||||
temp = self.stream.read(4)
|
temp = self.stream.read(4)
|
||||||
if len(temp) != 4:
|
if len(temp) != 4:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return int(temp[3]) | int(temp[2]) << 8 | int(temp[1]) << 16 | int(temp[0]) << 24
|
return int(temp[3]) | int(temp[2]) << 8 | int(temp[1]) << 16 | int(temp[0]) << 24
|
||||||
|
|
||||||
def read_short(self):
|
def read_ushort(self):
|
||||||
temp = self.stream.read(2)
|
temp = self.stream.read(2)
|
||||||
if len(temp) != 2:
|
if len(temp) != 2:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return int(temp[1]) | int(temp[0]) << 8
|
return int(temp[1]) | int(temp[0]) << 8
|
||||||
|
|
||||||
|
def read_short(self):
|
||||||
|
temp = self.read_ushort()
|
||||||
|
|
||||||
|
if temp == None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return ctypes.c_short(temp).value
|
||||||
|
|
||||||
|
def read_int(self):
|
||||||
|
temp = self.read_uint()
|
||||||
|
|
||||||
|
if temp == None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return ctypes.c_int(temp).value
|
||||||
|
|
||||||
def read_double(self):
|
def read_double(self):
|
||||||
temp = self.stream.read(8)
|
temp = self.stream.read(8)
|
||||||
if len(temp) != 8:
|
if len(temp) != 8:
|
||||||
@ -64,10 +80,8 @@ class Reader(ProgressGetter):
|
|||||||
for i in temp:
|
for i in temp:
|
||||||
if int(i) != 0:
|
if int(i) != 0:
|
||||||
# read double
|
# read double
|
||||||
result = 1
|
|
||||||
|
|
||||||
for j in range(1,8):
|
for j in range(1,8):
|
||||||
result += float(temp[8-j])/(2**(j*8))
|
result += float(temp[j])/(2.0**(j*8))
|
||||||
|
|
||||||
exp = int(temp[0]) & 0x7F
|
exp = int(temp[0]) & 0x7F
|
||||||
exp -= 64
|
exp -= 64
|
||||||
@ -78,6 +92,7 @@ class Reader(ProgressGetter):
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
# double is Zero
|
# double is Zero
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
@ -87,8 +102,8 @@ class Reader(ProgressGetter):
|
|||||||
def read_record(self):
|
def read_record(self):
|
||||||
result = Record()
|
result = Record()
|
||||||
try:
|
try:
|
||||||
result.len = self.read_short()
|
result.len = self.read_ushort()
|
||||||
result.ident = Records(self.read_short())
|
result.ident = Records(self.read_ushort())
|
||||||
except ValueError:
|
except ValueError:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@ -98,14 +113,14 @@ class Reader(ProgressGetter):
|
|||||||
|
|
||||||
def read_date(self):
|
def read_date(self):
|
||||||
# date
|
# date
|
||||||
year = self.read_short()
|
year = self.read_ushort()
|
||||||
month = self.read_short()
|
month = self.read_ushort()
|
||||||
day = self.read_short()
|
day = self.read_ushort()
|
||||||
|
|
||||||
# time
|
# time
|
||||||
hour = self.read_short()
|
hour = self.read_ushort()
|
||||||
minute = self.read_short()
|
minute = self.read_ushort()
|
||||||
second = self.read_short()
|
second = self.read_ushort()
|
||||||
|
|
||||||
return datetime(year=year, month=month, day=day, hour=hour, minute=minute, second=second)
|
return datetime(year=year, month=month, day=day, hour=hour, minute=minute, second=second)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user