Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2020
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.76 KB | None | 0 0
  1. import struct
  2.  
  3.  
  4. formats = {0: "B",   #client identifier
  5.            1: "fff", #pos
  6.            2: "fff"} #rot
  7.            
  8. terminator = 255
  9.  
  10.  
  11. def decode(data):
  12.    
  13.     byte = 0
  14.     prefix_index = 0
  15.     fmt = "B"
  16.     values = {}
  17.     prefixes = []
  18.     byte_values = []
  19.    
  20.     while prefix_index < len(data):
  21.         byte = data[prefix_index]
  22.         prefix_index += 1
  23.         if byte == terminator: break
  24.         if not formats.get(byte): return {}
  25.         fmt += "B"
  26.         byte_values.append(byte)
  27.         prefixes.append(byte)
  28.        
  29.     for prefix in prefixes:
  30.         fmt += formats[prefix]
  31.        
  32.     if not fmt: return {}
  33.  
  34.     try: data = struct.unpack(fmt, data)
  35.     except: return {}
  36.    
  37.     total_offset = len(prefixes)+1
  38.     for i, byte in enumerate(byte_values):
  39.         offset = len(formats[byte])
  40.         values[byte] = data[total_offset:total_offset+offset]
  41.         total_offset += offset
  42.        
  43.     return values
  44.  
  45. def encode(data:dict):
  46.    
  47.     fmt = ""
  48.     values = list(data.keys())
  49.     values.append(terminator)
  50.    
  51.     fmt += "B"*len(values)
  52.    
  53.     for key, value in data.items():
  54.         if formats.get(key):
  55.             fmt += formats[key]
  56.             values.extend(value)
  57.         else: b''
  58.    
  59.     try: data = struct.pack(fmt, *values)
  60.     except: data = b''
  61.    
  62.     return data
  63.        
  64.    
  65. #as you can refer to line 4, you can see that key 0 can be used
  66. #as a client identifier, 1 can be position, 2 can be rotation.
  67. #these setups can be customized however you want however you can
  68. #only have 0-254 keys (255 is reserved as a terminator)
  69. data = {0: (42,), 1: (-0.5, 1267.36, -56.7)}
  70.  
  71. #the data dict is first encoded into bytes.
  72. data = encode(data)
  73.  
  74. #using that encoded data, we can next decode it.
  75. #you can see the result is the same as the original data.
  76. print(decode(data))
  77.  
  78. #if the data is malformed in encoding or decoding,
  79. #encode() will return an empty byte list
  80. #decode() will return an empty dictionary
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement