1
0
forked from kalmar/DALGLI0
DALGLI0/Zadanie3

156 lines
3.3 KiB
Plaintext
Raw Normal View History

2018-06-25 19:53:53 +02:00
from sys import argv
2018-06-21 23:10:19 +02:00
2018-06-25 19:53:53 +02:00
def toBinary(string):
return "".join([format(ord(char),'#010b')[2:] for char in string])
2018-06-27 23:30:58 +02:00
def binnahex(var):
all = {"0000": "0",
"0001": "1",
"0010": "2",
"0011": "3",
"0100": "4",
"0101": "5",
"0110": "6",
"0111": "7",
"1000": "8",
"1001": "9",
"1010": "A",
"1011": "B",
"1100": "C",
"1101": "D",
"1110": "E",
"1111": "F"
}
i = 0
output = ""
while (len(var) % 4 != 0):
var = "0" + var
while (i < len(var)):
output = output + all[var[i:i + 4]]
i = i + 4
output = output.lstrip("0")
output = "0" if len(output) == 0 else output
return output
def toString(binaryString):
return "".join([chr(int(binaryString[i:i+8],2)) for i in range(0,len(binaryString),8)])
2018-06-25 19:53:53 +02:00
#XOR
def xor(a, b):
# init
result = []
# porownuje znaki
for i in range(1, len(b)):
if a[i] == b[i]:
result.append('0')
else:
result.append('1')
return ''.join(result)
# dzielenie modulo 2
def divide(message, poly16):
# Ilosc bitow dla operacji XOR 'na raz'
step = len(poly16)
# podzial krok po kroku
temp = message[0 : step]
while step < len(message):
if temp[0] == '1':
temp = xor(poly16, temp) + message[step]
else:
# jezeli 1 bit po lewej == 0
temp = xor('0'*step, temp) + message[step]
# kolejny krok
step += 1
if temp[0] == '1':
temp = xor(poly16, temp)
else:
temp = xor('0'*step, temp)
check = temp
return check
2018-06-28 01:07:44 +02:00
def decode(message_final,poly16,crc):
l_poly16 = len(poly16)
2018-06-28 01:07:44 +02:00
appended_message2 = toBinary(message_final)
obroc = list(appended_message2)
for i in range(l_poly16 - 1):
if obroc[i] == "0":
obroc[i] = "1"
elif obroc[i] == '1':
obroc[i] = "0"
appended_message2 = "".join(obroc)
dec = int(crc, 16)
crc2=bin(dec)[2:]
msg=appended_message2+crc2
remainder = divide(msg, poly16)
2018-06-25 19:53:53 +02:00
#Poprawione sprawdzanie
suma = 0
for i in range(0, len(remainder)):
2018-06-25 19:53:53 +02:00
if '1' in remainder:
suma = suma+1
if suma == 0:
print("true ")
elif suma > 0:
print("false")
2018-06-21 23:10:19 +02:00
2018-06-28 01:07:44 +02:00
2018-06-21 23:10:19 +02:00
def encode(message, poly16):
#konwersja z ascii do binarnego
aa=toBinary(message)
2018-06-27 23:30:58 +02:00
a=toString(aa)
2018-06-21 23:10:19 +02:00
l_poly16 = len(poly16)
2018-06-27 23:30:58 +02:00
obroc = list(aa)
for i in range(l_poly16 - 1):
if obroc[i] == "0":
obroc[i] = "1"
elif obroc[i] == '1':
obroc[i] = "0"
aa = "".join(obroc)
2018-06-25 19:53:53 +02:00
# Dodajemy n-1 "0" do wiadomosci
2018-06-27 23:30:58 +02:00
appended_message = aa + '0'*(l_poly16-1)
2018-06-21 23:10:19 +02:00
remainder = divide(appended_message, poly16)
2018-06-27 23:30:58 +02:00
ab=binnahex(remainder)
message_final = a + ab
print("calosc : ", message_final)
print("crc : ", ab)
poly16 = "10001000000100001"
2018-06-21 23:10:19 +02:00
2018-06-25 19:53:53 +02:00
def main():
global message
message = list(argv[1])
flag = argv[2]
if flag == 'encode':
encode(message, poly16)
2018-06-28 01:07:44 +02:00
elif flag == 'decode':
crc = argv[3]
decode(message, poly16,crc)
2018-06-25 19:53:53 +02:00
if __name__ == '__main__':
main()