Скачиваний:
0
Добавлен:
12.03.2026
Размер:
2.43 Кб
Скачать
import csv

def mask_leading_zeros_for_display(bits_str: str):
    bits = list(bits_str)
    i = 0
    while i < len(bits) and bits[i] == '0':
        bits[i] = ''
        i += 1
    if i == len(bits):      # если все нули — оставим один 0
        bits[-1] = '0'
    return bits

def crc_long_division_to_csv(msg_bits: str,
                             poly_bits: str,
                             filename: str = "crc16_long_division.csv"):
    n = len(poly_bits)

    # сообщение + (n-1) нулей для CRC
    work = list(msg_bits + "0" * (n - 1))
    total_len = len(work)

    rows = []

    # 1) первая строка – исходное число (один раз!)
    rows.append([""] + mask_leading_zeros_for_display("".join(work)))

    i = 0
    while i <= total_len - n:
        if work[i] == '1':
            # 2) строка: полином, сдвинутый на i
            poly_row = [""] + [""] * i + list(poly_bits) + [""] * (total_len - i - n)
            rows.append(poly_row)

            # XOR по модулю 2
            for j in range(n):
                work[i + j] = str(int(work[i + j]) ^ int(poly_bits[j]))

            # 3) строка: результат XOR (и он же будет "исходной" строкой для следующего шага)
            after = "".join(work)
            display_bits = mask_leading_zeros_for_display(after)
            rows.append([""] + display_bits)

        i += 1

    # остаток CRC — последние n-1 бит
    remainder = "".join(work[-(n - 1):])

    rows.append(["Остаток (CRC)"] + list(remainder))
    rows.append(["Длина остатка"] + [str(len(remainder))])

    # пишем CSV
    with open(filename, "w", newline="", encoding="utf-8") as f:
        writer = csv.writer(f, delimiter=";")
        writer.writerows(rows)

    print(f"Готово! Файл сохранён: {filename}")
    print("Остаток (CRC):", remainder)


if __name__ == "__main__":
    msg = "10110011100110110010111001100010111111111011010110110111110100000111" \
    "010111011111011001101010111111111100000101111011010111111001101101011010111001" \
    "01100111110111000111010001011011011010011111011111110101100001100110101101101100000"
    poly = "11000000000000101"  # x^16 + x^15 + x^2 + 1

    crc_long_division_to_csv(msg, poly, filename="crc16_long_division.csv")
Соседние файлы в папке код на питоне чтобы не считать вручную