Disclaimer: đây không phải là thực sự là một câu trả lời trực tiếp, mà là một loạt các câu hỏi và ý kiến cho rằng là quá dài cho một nhận xét.
Câu hỏi đầu tiên: Bạn có quyền kiểm soát cả hai đầu của giao thức, ví dụ: bạn có thể chọn thuật toán kiểm tra bằng chính bản thân hoặc đồng nghiệp kiểm soát mã ở đầu bên kia không?
Nếu CÓ đặt câu hỏi # 1:
Bạn cần phải đánh giá tại sao bạn cần checksum, những gì checksum là thích hợp, và hậu quả điểm nhận thông điệp tham nhũng với một kiểm tra hợp lệ (các yếu tố vào cả hai những gì & lý do tại sao).
Phương tiện truyền, giao thức, bitrate của bạn là gì? Bạn đang mong đợi/quan sát các lỗi bit? Vì vậy, ví dụ, với SPI hoặc I2C từ một chip khác trên cùng một bảng, nếu bạn có lỗi bit, nó có thể là lỗi kỹ sư HW hoặc bạn cần phải làm chậm tốc độ đồng hồ, hoặc cả hai. Một kiểm tra không thể làm tổn thương, nhưng không thực sự cần thiết. Mặt khác, với tín hiệu hồng ngoại trong môi trường ồn ào, và bạn sẽ có xác suất lỗi cao hơn nhiều.
Hậu quả của thư xấu luôn là câu hỏi quan trọng nhất ở đây. Vì vậy, nếu bạn đang viết bộ điều khiển cho nhiệt kế phòng kỹ thuật số và gửi một tin nhắn để cập nhật màn hình hiển thị 10x một giây, một giá trị xấu bao giờ 1000 tin nhắn có rất ít nếu có hại thực sự. Không có tổng kiểm tra hoặc kiểm tra yếu nên được tốt.
Nếu 6 byte này bắn tên lửa, hãy đặt vị trí của dao mổ robot hoặc gây chuyển tiền, bạn nên chắc chắn rằng mình có quyền kiểm tra chính xác và thậm chí có thể muốn xem băm mật mã có thể cần nhiều RAM hơn bạn có).
Đối với nội dung ở giữa, với tổn hại đáng chú ý đến hiệu suất/sự hài lòng với sản phẩm, nhưng không gây hại thực sự, đó là cuộc gọi của bạn.Ví dụ, một TV thỉnh thoảng thay đổi âm lượng thay vì kênh có thể gây khó chịu cho khách hàng - nhiều hơn là chỉ đơn giản bỏ lệnh nếu CRC tốt phát hiện lỗi, nhưng nếu bạn đang kinh doanh kiếm tiền/các TV knock-off có thể được chấp nhận nếu nó đưa sản phẩm ra thị trường nhanh hơn.
Vậy bạn cần kiểm tra những gì?
Nếu một hoặc cả hai đầu có HW hỗ trợ cho tổng kiểm tra được tích hợp vào thiết bị ngoại vi (khá phổ biến trong SPI chẳng hạn), đó có thể là lựa chọn khôn ngoan. Sau đó, nó trở nên nhiều hơn hoặc ít hơn miễn phí để tính toán.
Một LRC, theo đề xuất của câu trả lời của vulkanino, là thuật toán đơn giản nhất.
Wikipedia có một số thông tin khá về cách/tại sao để lựa chọn một đa thức nếu bạn thực sự cần một CRC: http://en.wikipedia.org/wiki/Cyclic_redundancy_check
Nếu KHÔNG cho câu hỏi # 1:
CRC gì thuật toán/đa thức hiện đầu kia yêu cầu? Đó là những gì bạn đang mắc kẹt, nhưng nói với chúng tôi có thể giúp bạn có được một câu trả lời tốt hơn/đầy đủ hơn.
Suy nghĩ về việc thực hiện:
Hầu hết các thuật toán là khá nhẹ về RAM/đăng ký, chỉ cần một vài byte thêm. Nói chung, một hàm sẽ dẫn đến mã tốt hơn, sạch hơn, dễ đọc hơn, thân thiện với trình gỡ lỗi.
Bạn nên nghĩ về giải pháp macro như một mẹo tối ưu hóa, và giống như tất cả các thủ thuật tối ưu hóa, nhảy tới đầu có thể lãng phí thời gian phát triển và nguyên nhân gây ra nhiều vấn đề hơn giá trị.
Sử dụng macro cũng có một số hàm ý lạ bạn có thể chưa cân nhắc:
Bạn biết rằng bộ tiền xử lý chỉ có thể thực hiện phép tính nếu tất cả các byte trong thư được cố định tại thời gian biên dịch, phải không? Nếu bạn có một biến trong đó, trình biên dịch phải tạo mã. Nếu không có một hàm, mã đó sẽ được inlined mỗi khi nó được sử dụng (có, điều đó có thể có nghĩa là rất nhiều việc sử dụng ROM). Nếu tất cả các byte là biến, mã đó có thể tồi tệ hơn là chỉ viết hàm trong C. Hoặc với trình biên dịch tốt, nó có thể tốt hơn. Khó khăn để nói chắc chắn. Mặt khác, nếu một số lượng byte khác nhau thay đổi tùy thuộc vào thư được gửi, bạn có thể kết thúc với một số phiên bản của mã, mỗi phiên bản được tối ưu hóa cho việc sử dụng cụ thể đó.
http://codegolf.stackexchange.com/questions/3268/compute-the-crc32-table-at-compile-time – Xophmeister
Nếu tốc độ quan trọng hơn bạn nhiều hơn bộ nhớ không bay hơi (flash), thì bạn có thể có tất cả các kết quả được tính toán trước và lưu trữ trong một bảng tra cứu không đổi. Đa thức CRC mà bạn mô tả được gọi là "CRC-8-CCITT". Tôi không biết thuật toán tối ưu cho thuật toán đó, tôi khuyên bạn nên tìm kiếm trên web. – Lundin