同步操作将从 编程语言算法集/Python 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
# Author: João Gustavo A. Amorim & Gabriel Kunz# Author email: joaogustavoamorim@gmail.com and gabriel-kunz@uergs.edu.br# Coding date: apr 2019# Black: True"""* This code implement the Hamming code:https://en.wikipedia.org/wiki/Hamming_code - In telecommunication,Hamming codes are a family of linear error-correcting codes. Hammingcodes can detect up to two-bit errors or correct one-bit errorswithout detection of uncorrected errors. By contrast, the simpleparity code cannot correct errors, and can detect only an odd numberof bits in error. Hamming codes are perfect codes, that is, theyachieve the highest possible rate for codes with their block lengthand minimum distance of three.* the implemented code consists of:* a function responsible for encoding the message (emitterConverter)* return the encoded message* a function responsible for decoding the message (receptorConverter)* return the decoded message and a ack of data integrity* how to use:to be used you must declare how many parity bits (sizePari)you want to include in the message.it is desired (for test purposes) to select a bit to be setas an error. This serves to check whether the code is working correctly.Lastly, the variable of the message/word that must be desired to beencoded (text).* how this work:declaration of variables (sizePari, be, text)converts the message/word (text) to binary using thetext_to_bits functionencodes the message using the rules of hamming encodingdecodes the message using the rules of hamming encodingprint the original message, the encoded message and thedecoded messageforces an error in the coded text variabledecodes the message that was forced the errorprint the original message, the encoded message, the bit changedmessage and the decoded message"""# Importsimport numpy as np# Functions of binary conversion--------------------------------------def text_to_bits(text, encoding="utf-8", errors="surrogatepass"):""">>> text_to_bits("msg")'011011010111001101100111'"""bits = bin(int.from_bytes(text.encode(encoding, errors), "big"))[2:]return bits.zfill(8 * ((len(bits) + 7) // 8))def text_from_bits(bits, encoding="utf-8", errors="surrogatepass"):""">>> text_from_bits('011011010111001101100111')'msg'"""n = int(bits, 2)return n.to_bytes((n.bit_length() + 7) // 8, "big").decode(encoding, errors) or "0円"# Functions of hamming code-------------------------------------------def emitter_converter(size_par, data):""":param size_par: how many parity bits the message must have:param data: information bits:return: message to be transmitted by unreliable medium- bits of information merged with parity bits>>> emitter_converter(4, "101010111111")['1', '1', '1', '1', '0', '1', '0', '0', '1', '0', '1', '1', '1', '1', '1', '1']>>> emitter_converter(5, "101010111111")Traceback (most recent call last):...ValueError: size of parity don't match with size of data"""if size_par + len(data) <= 2**size_par - (len(data) - 1):raise ValueError("size of parity don't match with size of data")data_out = []parity = []bin_pos = [bin(x)[2:] for x in range(1, size_par + len(data) + 1)]# sorted information data for the size of the output datadata_ord = []# data position template + paritydata_out_gab = []# parity bit counterqtd_bp = 0# counter position of data bitscont_data = 0for x in range(1, size_par + len(data) + 1):# Performs a template of bit positions - who should be given,# and who should be parityif qtd_bp < size_par:if (np.log(x) / np.log(2)).is_integer():data_out_gab.append("P")qtd_bp = qtd_bp + 1else:data_out_gab.append("D")else:data_out_gab.append("D")# Sorts the data to the new output sizeif data_out_gab[-1] == "D":data_ord.append(data[cont_data])cont_data += 1else:data_ord.append(None)# Calculates parityqtd_bp = 0 # parity bit counterfor bp in range(1, size_par + 1):# Bit counter one for a given paritycont_bo = 0# counter to control the loop readingfor cont_loop, x in enumerate(data_ord):if x is not None:try:aux = (bin_pos[cont_loop])[-1 * (bp)]except IndexError:aux = "0"if aux == "1" and x == "1":cont_bo += 1parity.append(cont_bo % 2)qtd_bp += 1# Mount the messagecont_bp = 0 # parity bit counterfor x in range(size_par + len(data)):if data_ord[x] is None:data_out.append(str(parity[cont_bp]))cont_bp += 1else:data_out.append(data_ord[x])return data_outdef receptor_converter(size_par, data):""">>> receptor_converter(4, "1111010010111111")(['1', '0', '1', '0', '1', '0', '1', '1', '1', '1', '1', '1'], True)"""# data position template + paritydata_out_gab = []# Parity bit counterqtd_bp = 0# Counter p data bit readingcont_data = 0# list of parity receivedparity_received = []data_output = []for i, item in enumerate(data, 1):# Performs a template of bit positions - who should be given,# and who should be parityif qtd_bp < size_par and (np.log(i) / np.log(2)).is_integer():data_out_gab.append("P")qtd_bp = qtd_bp + 1else:data_out_gab.append("D")# Sorts the data to the new output sizeif data_out_gab[-1] == "D":data_output.append(item)else:parity_received.append(item)# -----------calculates the parity with the datadata_out = []parity = []bin_pos = [bin(x)[2:] for x in range(1, size_par + len(data_output) + 1)]# sorted information data for the size of the output datadata_ord = []# Data position feedback + paritydata_out_gab = []# Parity bit counterqtd_bp = 0# Counter p data bit readingcont_data = 0for x in range(1, size_par + len(data_output) + 1):# Performs a template position of bits - who should be given,# and who should be parityif qtd_bp < size_par and (np.log(x) / np.log(2)).is_integer():data_out_gab.append("P")qtd_bp = qtd_bp + 1else:data_out_gab.append("D")# Sorts the data to the new output sizeif data_out_gab[-1] == "D":data_ord.append(data_output[cont_data])cont_data += 1else:data_ord.append(None)# Calculates parityqtd_bp = 0 # parity bit counterfor bp in range(1, size_par + 1):# Bit counter one for a certain paritycont_bo = 0for cont_loop, x in enumerate(data_ord):if x is not None:try:aux = (bin_pos[cont_loop])[-1 * (bp)]except IndexError:aux = "0"if aux == "1" and x == "1":cont_bo += 1parity.append(str(cont_bo % 2))qtd_bp += 1# Mount the messagecont_bp = 0 # Parity bit counterfor x in range(size_par + len(data_output)):if data_ord[x] is None:data_out.append(str(parity[cont_bp]))cont_bp += 1else:data_out.append(data_ord[x])ack = parity_received == parityreturn data_output, ack# ---------------------------------------------------------------------"""# Example how to use# number of parity bitssizePari = 4# location of the bit that will be forced an errorbe = 2# Message/word to be encoded and decoded with hamming# text = input("Enter the word to be read: ")text = "Message01"# Convert the message to binarybinaryText = text_to_bits(text)# Prints the binary of the stringprint("Text input in binary is '" + binaryText + "'")# total transmitted bitstotalBits = len(binaryText) + sizePariprint("Size of data is " + str(totalBits))print("\n --Message exchange--")print("Data to send ------------> " + binaryText)dataOut = emitterConverter(sizePari, binaryText)print("Data converted ----------> " + "".join(dataOut))dataReceiv, ack = receptorConverter(sizePari, dataOut)print("Data receive ------------> "+ "".join(dataReceiv)+ "\t\t -- Data integrity: "+ str(ack))print("\n --Force error--")print("Data to send ------------> " + binaryText)dataOut = emitterConverter(sizePari, binaryText)print("Data converted ----------> " + "".join(dataOut))# forces errordataOut[-be] = "1" * (dataOut[-be] == "0") + "0" * (dataOut[-be] == "1")print("Data after transmission -> " + "".join(dataOut))dataReceiv, ack = receptorConverter(sizePari, dataOut)print("Data receive ------------> "+ "".join(dataReceiv)+ "\t\t -- Data integrity: "+ str(ack))"""
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。