Commit | Line | Data |
---|---|---|
b0cfbfce IJ |
1 | # SLIP handling |
2 | ||
3 | end = b'\300' | |
4 | esc = b'\333' | |
5 | esc_end = b'\334' | |
6 | esc_esc = b'\335' | |
7 | delimiter = end | |
8 | ||
9 | def encode(packet): | |
10 | return (packet | |
11 | .replace(esc, esc + esc_esc) | |
12 | .replace(end, esc + esc_end)) | |
13 | ||
7fa9c132 | 14 | def decode(data, keep_tail=False): |
6f387df3 | 15 | #print('DECODE ', repr(data)) |
b0cfbfce | 16 | out = [] |
7fa9c132 IJ |
17 | inp = data.split(end) |
18 | tail = [] | |
19 | if keep_tail: | |
20 | tail.append(inp.pop()) | |
21 | for packet in inp: | |
b0cfbfce IJ |
22 | pdata = b'' |
23 | while True: | |
24 | eix = packet.find(esc) | |
25 | if eix == -1: | |
26 | pdata += packet | |
27 | break | |
28 | #print('ESC ', repr((pdata, packet, eix))) | |
29 | pdata += packet[0 : eix] | |
30 | ck = packet[eix+1] | |
31 | #print('ESC... %o' % ck) | |
32 | if ck == esc_esc[0]: pdata += esc | |
33 | elif ck == esc_end[0]: pdata += end | |
e8fcf3b7 | 34 | else: raise ValueError('invalid SLIP escape 0%o %#x' % (ck, ck)) |
b0cfbfce IJ |
35 | packet = packet[eix+2 : ] |
36 | out.append(pdata) | |
b68c0739 | 37 | #print('DECODED ', repr(out)) |
7fa9c132 | 38 | out += tail |
b0cfbfce IJ |
39 | return out |
40 | # -*- python -*- | |
41 |