Tôi đang cố gắng tính chuỗi khung kiểm tra (FCS) của byte gói Ethernet theo byte. Đa thức là 0x104C11DB7
. Tôi đã làm theo thuật toán XOR-SHIFT được thấy ở đây http://en.wikipedia.org/wiki/Cyclic_redundancy_check hoặc tại đây http://www.woodmann.com/fravia/crctut1.htmTính toán CRC32 Ethernet - phần mềm so với kết quả thuật toán
Giả sử thông tin được cho là có CRC chỉ là một byte. Giả sử nó là 0x03.
bước: pad với 32 bit bên phải
0x0300000000
align đa thức và các dữ liệu ở phía bên tay trái với bit đầu tiên của họ mà không phải là zero và xor họ
0x300000000 xor 0x209823B6E = 0x109823b6e
lấy lại phần còn lại và xor lần nữa
0x109823b6e xor 0x104C11DB7 = 0x0d4326d9
Vì không có chút rời CRC32 của 0x03 nên 0x0d4326d9
Đáng tiếc là tất cả việc triển khai phần mềm cho tôi biết tôi sai, nhưng tôi đã làm gì sai hay gì họ có đang làm khác không?
Python nói với tôi:
"0x%08x" % binascii.crc32(chr(0x03))
0x4b0bbe37
Các công cụ trực tuyến ở đây http://www.lammertbies.nl/comm/info/crc-calculation.html#intr được kết quả tương tự. Sự khác biệt giữa tính toán tay của tôi và thuật toán mà phần mềm được đề cập sử dụng là gì?
UPDATE:
Hóa ra có một câu hỏi tương tự đã có trên stack overflow:
Bạn tìm thấy một câu trả lời ở đây Python CRC-32 woes
Mặc dù đây không phải là rất trực quan. Nếu bạn muốn có một mô tả chính thức thêm về cách nó được thực hiện cho Ethernet khung bạn có thể nhìn vào Ethernet Standard document 802.3 Phần 3 - Chương 3.2.9 Khung Kiểm tra trình tự Dòng
Cho phép tiếp tục ví dụ với phần trên:
Đảo ngược thứ tự bit của tin nhắn của bạn. Điều đó đại diện cho cách họ sẽ đi vào máy thu từng chút một.
0x03
do đó là0xC0
Bổ sung 32 bit đầu tiên của thông điệp của bạn. Lưu ý rằng chúng ta sẽ nén byte đơn với 32 bit một lần nữa.
0xC000000000 xor 0xFFFFFFFF = 0x3FFFFFFF00
Hoàn thành XOR và phương pháp thay đổi từ trên một lần nữa. Sau khoảng 6 bước bạn nhận được: sau đó
0x13822f2d
Bit sequense trên được bổ sung.
0x13822f2d xor 0xFFFFFFFF = 0xec7dd0d2
Hãy nhớ rằng chúng ta đảo ngược thứ tự chút để có được đại diện trên dây Ethernet trong bước một. Bây giờ chúng ta phải đảo ngược bước này và cuối cùng chúng ta hoàn thành nhiệm vụ của mình.
0x4b0bbe37
Ai đã đưa ra cách này để làm việc đó nên ...
Rất nhiều lần bạn thực sự muốn biết nó là thông điệp mà bạn nhận được là chính xác. Để đạt được điều này, bạn nhận được tin nhắn đã nhận của bạn bao gồm FCS và thực hiện các bước tương tự từ 1 đến 5 như trên. Kết quả phải là những gì họ gọi là dư lượng. Đó là một hằng số cho một đa thức nhất định. Trong trường hợp này, nó là 0xC704DD7B
.
Là mcdowella đề cập đến bạn phải chơi xung quanh với các bit của bạn cho đến khi bạn làm đúng, tùy thuộc vào Ứng dụng bạn đang sử dụng.
0x209823B6E xuất phát từ đâu? – grieve
Ngoài ra, bạn đã đặt số dư ban đầu của mình thành 0xFFFFFFFF – grieve
0x209823B6E là phiên bản được dịch chuyển của đa thức để căn chỉnh nó với dữ liệu – sebs