Добавил:
kogster
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Практики / Практика_6 / код на питоне чтобы не считать вручную / crc_steps_32_check
.pyimport csv
def mask_leading_zeros_for_display(bits_str: str):
"""
Для отображения в Excel:
ведущие '0' → пустые ячейки ''.
Если строка вся нулевая — оставляем один 0.
"""
bits = list(bits_str)
i = 0
while i < len(bits) and bits[i] == '0':
bits[i] = ''
i += 1
if i == len(bits):
bits[-1] = '0'
return bits
def crc_check_to_csv(msg_with_crc: str,
poly_bits: str,
filename: str = "crc_check.csv"):
"""
Проверка CRC:
- Берём сообщение+CRC
- Делим на полином
- Никаких добавлений нулей!
- Печатаем шаги деления в CSV (как в столбик)
"""
work = list(msg_with_crc)
total_len = len(work)
n = len(poly_bits)
rows = []
# 1) первая строка — исходное число (сообщение + CRC)
rows.append([""] + mask_leading_zeros_for_display("".join(work)))
i = 0
while i <= total_len - n:
if work[i] == '1':
# 2) полином со сдвигом
poly_row = [""] + [""] * i + list(poly_bits) + [""] * (total_len - i - n)
rows.append(poly_row)
# 3) XOR
for j in range(n):
work[i + j] = str(int(work[i + j]) ^ int(poly_bits[j]))
# 4) результат → следующее число
after = "".join(work)
rows.append([""] + mask_leading_zeros_for_display(after))
i += 1
# Остаток = последние (n-1) бит
remainder = "".join(work[-(n - 1):])
rows.append(["Остаток"] + list(remainder))
rows.append(["Длина"] + [str(len(remainder))])
with open(filename, "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f, delimiter=";")
writer.writerows(rows)
print(f"Файл сохранён: {filename}")
print("Остаток:", remainder)
# ========================
# ПРИМЕР
# ========================
if __name__ == "__main__":
# твоя строка = сообщение + CRC (ДОЛЖНА быть готовая, конечная)
msg_with_crc = "101100111001101100101110011000101111111110110101101101111101000001110" \
"10111011111011001101010111111111100000101111011010111111001101101011010111001011001111101" \
"1100011101000101101101101001111101111111010110000110011010110110110000011110001001101011111111101011001"
# твой CRC-32 полином
poly = "100000100110000010001110110110111"
crc_check_to_csv(msg_with_crc, poly, "crc32_check.csv")
Соседние файлы в папке код на питоне чтобы не считать вручную
