]> AND Private Git Repository - Cipher_code.git/blob - measure_energy_iot/buffer.py
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
up
[Cipher_code.git] / measure_energy_iot / buffer.py
1 class Buffer:
2     def __init__(self,s):
3         '''Buffer a pre-created socket.
4         '''
5         self.sock = s
6         self.buffer = b''
7
8     def get_bytes(self,n):
9         '''Read exactly n bytes from the buffered socket.
10            Return remaining buffer if <n bytes remain and socket closes.
11         '''
12         while len(self.buffer) < n:
13             data = self.sock.recv(1024)
14             if not data:
15                 data = self.buffer
16                 self.buffer = b''
17                 return data
18             self.buffer += data
19         # split off the message bytes from the buffer.
20         data,self.buffer = self.buffer[:n],self.buffer[n:]
21         return data
22
23     def put_bytes(self,data):
24         self.sock.sendall(data)
25
26     def get_utf8(self):
27         '''Read a null-terminated UTF8 data string and decode it.
28            Return an empty string if the socket closes before receiving a null.
29         '''
30         while b'\x00' not in self.buffer:
31             data = self.sock.recv(1024)
32             if not data:
33                 return ''
34             self.buffer += data
35         # split off the string from the buffer.
36         data,_,self.buffer = self.buffer.partition(b'\x00')
37         return data.decode()
38
39     def put_utf8(self,s):
40         if '\x00' in s:
41             raise ValueError('string contains delimiter(null)')
42         self.sock.sendall(s.encode() + b'\x00')