-
Notifications
You must be signed in to change notification settings - Fork 0
/
ex4-2.py
57 lines (57 loc) · 2.12 KB
/
ex4-2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#父類別
class INOUT:
def __init__(self,handle):
self.handle = handle
#data_to_nbyte 把檔案轉byte
def data_to_nbyte(self,n):
if isinstance(n,int):
if n < ( 1 << 8 ): tag = 'B'
elif n < ( 1 << 16 ):tag = 'H'
elif n < ( 1 << 32 ):tag = 'L'
else: tag ='Q'
n=struct.pack('!'+ tag , n )
return tag.encode('utf-8') + n
elif isinstance(n,bytes):
tag = 's'
return tag.encode('uft-8')+ self.data_to_nbyte(len(n)) + n
elif isinstance(n,str):
tag = 'c'
n = n.encode('utf-8')
return tag.encode('utf-8')+self.data_to_nbyte(len(n)) + n
raise TypeError('Invalid type:' + type(tag))
#nbyte_to_data把byte轉檔案
def nbyte_to_data(self):
size_info = {'B':1,'H':2,'L':4 ,'Q':8}
btag = self.read_raw(1)
if not btag:
return None
tag =btag.decode('utf-8')
if tag in size_info:
size =size_info[tag]
bnum = self.read_raw(size)
result = struct.unpack('!' + tag,bnum)[0]
elif tag in ['s','c']:
size =self.nbyte_to_data()
if size >= 65536:
raise ValueError('length too long' + str(size))
bstr =self.read_raw(size)
result =bstr if tag == 's' else bstr.decode('utf-8')
else:
raise TypeError ( 'Invalid type' + tag )
return result
#
def read(self):
return self.nbyte_to_data()
def write(self,d):
byte_data = self.data_to_nbyte(d)
self.write_handle(byte_data)
def close(self):
return self.close_handle()
#這裡就是子類別定義的地方
def read_handle(self,n):
return b''
def write_handle(self,d):
print(d)
return len(d)
def close_handle(self):
return self.handle