-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfuncoes_aux.py
More file actions
97 lines (77 loc) · 3.52 KB
/
funcoes_aux.py
File metadata and controls
97 lines (77 loc) · 3.52 KB
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import types
import random
consts = types.SimpleNamespace()
consts.DATA = 1
consts.MENSAGEM_MOTIVACIONAL = 2
consts.QUANTIDADE_RESPOSTAS_SERVIDOR = 3
def print_comandos():
print("Tipos de requisição: ")
print("1 - Data e hora atual")
print("2 - Uma mensagem motivacional para o fim do semestre")
print("3 - A quantidade de respostas emitidas pelo servidor até o momento")
print("4 - Sair")
def cheksum(lista_bytes):
tamanho_lista = len(lista_bytes)
if tamanho_lista % 2 == 0: # Verifica se o tamanho da lista_bytes é par
pass
else:
lista_bytes = lista_bytes + bytes([0]) # Se não, adiciona um byte zero no fim da lista
tamanho_lista = len(lista_bytes) # Atualiza o tamanho da lista
index = 0
resultado = 0
for i in range(int(tamanho_lista/4)):
# Soma as palavras de 16 bits na lista e soma com a palavra guardada em resultado
resultado = somar_palavra_16bits(resultado, somar_palavra_16bits(lista_bytes[index] << 8 | lista_bytes[index + 1],lista_bytes[index + 2] << 8 | lista_bytes[index + 3]))
index += 4
return ~resultado & 0xFFFF # inverte os bits do resultado
def somar_palavra_16bits(palavra1, palavra2):
resultado = palavra1 + palavra2
while resultado.bit_length() > 16: # Verifica se a soma da palavra1 + palavra2 tem mais de 16 bits, se sim um carryout do bit mais significativo vai ser somado ao resultado
carry = resultado >> 16
resultado &= 0xFFFF
resultado += carry
return resultado
def dividir_numero_2_bytes(numero): # Divide um int em uma lista com 2 bytes seguindo a ordenação big endian
numero = numero.to_bytes(2, byteorder='big')
return numero
def trasformar_string_ip_em_bytes(ip): # Remove os pontos da string ip e transforma a string em uma lista de bytes
lista_string = ip.split('.')
lista_int = []
for i in lista_string:
lista_int.append(int(i))
return bytes(lista_int)
def sortear_identificador(): # Retorna um numero aleatorio de 1 a 65535
return random.randint(1, 65535)
def criar_requisicao(tipo, identificador): # Codifica a requisição de acordo com as especificações do projeto
byte1 = 0b00000000
bytes_identificador = dividir_numero_2_bytes(identificador)
match tipo:
case consts.DATA:
pass
case consts.MENSAGEM_MOTIVACIONAL:
byte1 = byte1 | 0b0001
case consts.QUANTIDADE_RESPOSTAS_SERVIDOR:
byte1 = byte1 | 0b0010
mensagem = bytes([byte1, bytes_identificador[0], bytes_identificador[1]])
return mensagem
def bytes_to_string(lista_bytes): # Trasforma uma lista de bytes em um string
return ''.join(chr(i) for i in lista_bytes)
def bytes_to_int(lista_bytes): # Trasforma uma lista de bytes em um int
return int.from_bytes(bytes(lista_bytes), byteorder='big')
def decodificar_resposta(dados): # Decodifica a resposta de acordo com as especificações do projeto
tipo = dados[0]
tamanho_resposta = dados[3]
lista_bytes = []
match tipo:
case 0x10:
for i in range(tamanho_resposta):
lista_bytes.append(dados[4+i])
return bytes_to_string(lista_bytes)
case 0x11:
for i in range(tamanho_resposta):
lista_bytes.append(dados[4+i])
return bytes_to_string(lista_bytes)
case 0x12:
for i in range(tamanho_resposta):
lista_bytes.append(dados[4+i])
return bytes_to_int(lista_bytes)