Mạng máy tính phát sinh từ nhu cầu muốn chia sẻ, dùng chung tài nguyên và cho phép giao tiếp trực tuyến (online) cũng như các ứng dụng đa phương tiện trên mạng. Tài nguyên gồm có các phần mềm (dữ liệu, chương trình ứng dụng,.) và tài nguyên phần cứng (máy in, máy quét, CD ROM , .). Giao tiếp trực tuyến bao gồm gửi và nhận thông điệp, thư điện tử. Các ứng dụng đa phương tiện có thể phát là phát thanh, truyền hình, điện thoại qua mạng, hội thảo trực tuyến, nghe nhạc, xem phim trên mạng.
Trong giáo trình Mạng máy tính và truyền số liệu mà chúng ta đang nghiên cứu, có một phần rất quan trọng đó là : Các vấn đề liên quan đến mạng máy tính. Và đề tài mà chúng tôi tìm hiểu đó là : " Cài đặt thuật toán tính CRC ", đây là một phần khá quan trọng liên quan đến các vấn đề của mạng.
Bài báo cáo của nhóm tôi gồm 3 phần :
Phần 1 : Giới thiệu
Phần 2 : Nội dung
Phần 3 : Chạy chương trình
22 trang |
Chia sẻ: tuandn | Lượt xem: 4308 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu Đề tài Cài đặt thuật toán tính CRC, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
TRƯỜNG ĐẠI HỌC KINH TẾ QUỐC DÂN
BỘ MÔN CÔNG NGHỆ THÔNG TIN
Môn : Mạng máy tính và truyền số liệu
Đề tài : Cài đặt thuật toán tính CRC
Sinh viên : Vũ Văn Linh
Phan Đình Lợi
Nguyễn Thị Mai
Hà Nội 5/2010
Lời mở đầu
Mạng máy tính phát sinh từ nhu cầu muốn chia sẻ, dùng chung tài nguyên và cho phép giao tiếp trực tuyến (online) cũng như các ứng dụng đa phương tiện trên mạng. Tài nguyên gồm có các phần mềm (dữ liệu, chương trình ứng dụng,...) và tài nguyên phần cứng (máy in, máy quét, CD ROM , ...). Giao tiếp trực tuyến bao gồm gửi và nhận thông điệp, thư điện tử. Các ứng dụng đa phương tiện có thể phát là phát thanh, truyền hình, điện thoại qua mạng, hội thảo trực tuyến, nghe nhạc, xem phim trên mạng...
Trong giáo trình Mạng máy tính và truyền số liệu mà chúng ta đang nghiên cứu, có một phần rất quan trọng đó là : Các vấn đề liên quan đến mạng máy tính. Và đề tài mà chúng tôi tìm hiểu đó là : " Cài đặt thuật toán tính CRC ", đây là một phần khá quan trọng liên quan đến các vấn đề của mạng.
Bài báo cáo của nhóm tôi gồm 3 phần :
Phần 1 : Giới thiệu
Phần 2 : Nội dung
Phần 3 : Chạy chương trình
Dù đã tìm hiểu rất kỹ nhưng trong bài báo cáo không tránh khỏi thiếu sót. Chúng tôi xin trân trọng tiếp thu tất cả những ý kiến đóng góp của cô và các bạn để hoàn thiện bản báo cáo này hơn nữa.
Xin trân thành cảm ơn !
Mục lục
Phần I : Giới thiệu......................................................................................
Phần II : Nội dung......................................................................................
II.1. Định nghĩa..................................................................................
CRC là gì ?.......................................................................
Giới thiệu chung về CRC ..............................................
II.2. Tư tưởng của phương pháp CRC...............................................
II.3. Thuật toán.................................................................................
II.4. Tính toán CRC..........................................................................
Cách tính CRC-8 trong việc kiểm soát lỗi dữ liệu được truyền............................................................................................
II.4.2.Cách 2: Phương pháp Table-Driven ........................
II.4.1. Cách 1: Phương pháp Direct Calculation ................
II.5. Các hàm CRC thường dùng và được tiêu chuẩn hóa..........
II.6. Chương trình chạy..................................................................
II.7. Ứng dụng thực tế.................................................................
Phần III : Tổng kết................................................................................
Phần IV : Tài liệu tham khảo...............................................................
Phần I. Giới thiệu
Trong quá trình sử dụng máy tính, chắc hẳn bạn đã không ít lần cảm thấy khó chịu (đặc biệt là khi bạn đã tốn hàng giờ để download một tập tin quan trọng) khi gặp phải thông báo lỗi của WinZip từ chối xả nén một tập tin vì phép kiểm CRC thấy bại. Tại sao các phần mềm nén lại phải thực hiện phép kiểm tra CRC mỗi khi nó xả nén một tập tin?
CRC (cyclic redundancy check) là một loại hàm băm, được dùng để sinh ra giá trị kiểm thử, của một chuỗi bit có chiều dài ngắn và cố định, của các gói tin vận chuyển qua mạng hay một khối nhỏ của tệp dữ liệu. Giá trị kiểm thử được dùng để dò lỗi khi dữ liệu được truyền hay lưu vào thiết bị lưu trữ. Giá trị của CRC sẽ được tính toán và đính kèm vào dữ liệu trước khi dữ liệu được truyền đi hay lưu trữ. Khi dữ liệu được sử dụng, nó sẽ được kiểm thử bằng cách sinh ra mã CRC và so khớp với mã CRC trong dữ liệu.
CRC rất phổ biến, vì nó rất đơn giản để lắp đặt trong các máy tính sử dụng hệ cơ số nhị phân, dễ dàng phân tích tính đúng, và rất phù hợp để dò các lỗi gây ra bởi nhiễu trong khi truyền dữ liệu.
Phần II : Nội dung
II.1. Định nghĩa
CRC là gì ?
CRC là một loại mã phát hiện lỗi. Cách tính toán của nó giống như phép toán chia số dài trong đó thương số được loại bỏ và số dư là kết quả, điểm khác biệt ở đây là sử dụng cách tính không nhớ (carry-less arithmetic) của một trường hữu hạn. Độ dài của số dư luôn nhỏ hơn hoặc bằng độ dài của số chia, do đó số chia sẽ quyết định độ dài có thể của kết quả trả về.
Định nghĩa đối với từng loại CRC đặc thù quyết định số chia nào được sử dụng, cũng như nhiều ràng buộc khác.
Giới thiệu chung về CRC
Mặc dù các mã CRC có thể xây dựng được bằng cách sử dụng bất kỳ trường hữu hạn nào, nhưng tất cả các mã CRC thường dùng đều sử dụng trường hữu hạn GF(2). Đây là trường hai phần tử, thường được ký hiệu là 0 và 1, phù hợp với kiến trúc máy tính. Phần còn lại của bài viết sẽ chỉ đề cập đến những mã CRC thuộc dạng này, nhưng nguyên tắc thì khái quát hơn.
Một lý do quan trong lý giải sự phổ biến của mã CRC trong phát hiện sự thay đổi ngẫu nhiên của dữ liệu là hiệu suất đảm bảo. Điển hình, một mã CRC n bit, được áp dụng cho một đoạn dữ liệu có độ dài tùy ý, sẽ phát hiện được bất kỳ lỗi tín hiệu đơn nào có độ dài không quá n bit (nói cách khác, bất kỳ sự biến đổi đơn lẻ nào có chiều dài không quá n bit của dữ liệu), và sẽ phát hiện một phần 1-2-n của tất cả các lỗi tín hiệu có độ dài dài hơn thế. Các lỗi trong cả các kênh truyền dữ liệu và phương tiện bộ nhớ từ dẫn đến phân bố không ngẫu nhiên (v.d, "bursty"), làm cho các đặc tính của CRC trở nên hữu dụng hơn những mã khác như Multiple Parity checks.
Hệ thống tìm lỗi đơn giản nhất, bit parity (xet chẵn lẽ), thực ra là một mã CRC ở dạng tầm thường: sử dụng số chia độ dài 2 bit là 11.
II.2. Tư tưởng của phương pháp CRC
Cho trước một đa thức (gọi là đa thức sinh) G(x) với hệ số bậc cao nhất và thấp nhất đều bằng 1.
Tìm tập bít kiểm tra Checksum thỏa mãn điều kiện : đa thức tương ứng với xâu ghép (xâu gốc và checksum) phải chia hết (theo modulo 2) cho G(x).
Khi nhận tin, bên nhận kiểm tra lỗ bằng cách lấy xâu bít nhận được chia (modulo 2) cho G(x). Nếu không chia hết thì có nghĩa là đã có lỗi (ngược lại thì cũng chưa thể khẳng định là không có lỗi).
Giả sử G(x) có bậc là r, xâu bít gốc tương ứng với đa thức M(x) có bậc m. Các bước tính Checksum như sau :
B1 : Thêm r bít 0 vào cuối xâu bít cần truyền : xâu ghép sẽ gồm có m + r bít tương ứng với đa thức x^r M(x).
B2 : Chia (Modulo 2) xâu bít tương ứng cho xâu bít tương ứng với G(x).
B3 : Lấy xâu bit bị chia trừ (modulo 2) cho số dư. Kết quả là xâu bit được truyền đi (xâu gốc + checksum). Ký hiệu đa thức tương ứng với nó là T(x), rõ ràng T(x) chia hết (modulo 2) cho G(x).
Thí dụ áp dụng : Cho xâu bit 1101010111, đa thức sinh G(x) = x^4+x^3+x+1, hãy tính xâu bít được truyền đi trên mạng.
Xâu bít gốc 1101010111 tương ứng với đa thức M(x) = x^9+x^8+x^6+x^4+x^2+x+1.
Đa thức sinh G(x) = x^4+x^3+x+1 tương ứng với xâu bit 11011.
X^r M(x) = 11010101110000
1000100001
11010101110000
11011
11011
11011
010000
10011
0011
Checksum
11011
Kết quả :
Checksum = 0011
Xâu bít được truyền đi trên mạng là : T(x) = 11010101110011.
II.3. Thuật toán
Bài toán: tìm chuỗi bit đầu ra của chuỗi dữ liệu cần truyền M với đa thức sinh P.
Cách làm:
Đầu vào:
Nhập chuỗi M dưới dạng nhị phân( 0,1)
Chuỗi P dưới dạng nhị phân có r+1 bit và ngắn hơn chuỗi M
Thao tác:
Thêm r số 0 vào sau chuỗi M, tức là ta thực hiện phép toán M.2r
Tính FCS là số dư của phép chia M.2r cho P.
Ghép số dư vào đuôi của chuỗi M ta được chuỗi mới M|FCS( là chuỗi ra)
Đầu ra:
In ra chuỗi M|FCS
Ví dụ:
Chuỗi dữ liệu cần truyền M = 11100011 ( 8 bit)
Đa thức sinh P =110011 có 6 bit( à r=5), vậy ta thêm 5 số 0 vào sau của chuỗi M(x) ta được chuỗi M(x).2r có dạng là 1110001100000.
Lấy chuỗi này chia cho P bằng cách sau( ở đây phép chia được hiểu là 1 số lần của phép trừ nhưng không có “nhớ” hay “mượn” như các phép toán nhị phân thông thường ):
1110001100000(trừ)110011---------------0010111100000, dịch sang trái 2 bit vì 2 số 0 đầu bỏ đi, thành10111100000(trừ)110011-------------01110000000, dịch trái 1 bit, thành1110000000(trừ)110011-----------0010110000, lại dịch trái 2 bit, thành10110000(trừ)110011-------01111100, dịch trái 1 bit, thành1111100(trừ)110011--------0011010, dịch trái 2 bit thành 11010, số này có số chữ số là 5, nhỏ hơn 6 là số chữ số của P, không chia được và là số dư.
Vậy FCS( hay số dư của phép chia) sẽ là 11010.
Ghép với M ta được M|FCS : 1110001111010
Đây là chuỗi cần tìm.
II.4. Tính toán CRC
Cách tính CRC-8 trong việc kiểm soát lỗi dữ liệu được truyền
II.4.1. Cách 1: Phương pháp Direct Calculation
Giả sử ta có chuỗi data như sau:
MSB LSB
10000000 00000001 10100011 = Data String (80 01 A3 h)
Đa thức sử dụng để tính CRC-8:
g(D) = D8 + D2 + D + 1 => 1 0000 0111 (Polynomial)
Tư tưởng chính là ta cứ thực hiện phép XOR giữa data string và polynomial.
Đối với chuỗi data string, ta thêm 8 bits 0 vào cuối (ở vị trí LSB) 1 lần duy nhất trước khi thực hiện các phép XOR sau đó.
Lưu ý là bit đầu tiên trong Polynomial ( 1 0000 0111 ) được align thẳng hàng với bit có giá trị là 1 đầu tiên trong data string tính từ MSB ( 1 0000000 00000001 10100011 00000000 )
Phép XOR có rule như sau:
0 + 0 => 0 1 + 1 => 0 0 + 1 => 1 1 + 0 => 1
Điều kiện dừng của phép lặp XOR là khi ta align polynomial với data string thì tính từ vị trí xuất hiện giá trị 1 đầu tiên của data string đến cuối data string không đủ 8 bit. Nên kết quả data string của phép XOR cuối cùng chính là CRC-8 10000000 00000001 10100011 => data string 10000000 00000001 10100011 00000000 (add 8 bits value 0) 10000011 1 (polynomial) 00000011 10000001 10100011 00000000 (XOR between data string and polynomial) 10 0000111 (move polynomial to the next appear of value 1 in data string) 01 10001111 10100011 00000000 1 00000111 0 10001000 10100011 00000000 10000011 1 00001011 00100011 00000000 1000 00111 0011 00011011 00000000 10 0000111 II.4.2.Cách 2: Phương pháp Table-Driven Giả sử ta có chuỗi data như sau: MSB LSB 10000000 00000001 10100011 00000000 = Data String (80 01 A3 h). 1. Khởi tạo 1 biến 1 byte với giá trị là 0 (8 bits đều là 0).2. Thực hiện phép XOR giữa data string với byte vừa khởi tạo đó.3. Giá trị sau khi XOR của byte đầu tiên được sử dụng để tra trong bảng tìm kiếm.Cách tra như sau: - Bảng có giá trị index từ 0->255 (ví dụ tên bảng là tbl) nên khi giá trị cần tra là 00010010b (18 dec) => kết quả trả về là tbl[ 18 ] là 0x7E (01111110b) 4. Dịch chuỗi data string 8 bits về bên trái 5. Tiếp tục thực hiện phép XOR giữa chuỗi data string và kết quả vừa tra được trong bảng tìm kiếm (lưu ý là chúng ta luôn so byte đầu tiên bên MSB) 6. Thực hiện tương tự cho đến byte cuối cùng thì kết quả tra được chính là CRC-8 10000000 00000001 10100011 00000000 (data string) 00000000 (init variable) 10000000 00000001 10100011 00000000 (XOR result) 10001001 (result in lookup table) 00000001 10100011 00000000 (shift 8th bit of data string to left) 10001000 (XOR with above result lookup table) 10110001 (result in lookup table) 10100011 00000000 (shift 8th bit of data string to left) 00010010 (XOR with above result lookup table) 01111110 (result in lookup table) 00000000 (shift 8th bit of data string to left) 01111110 => CRC Cách tạo bảng tham chiếu CRC:
Để tạo bảng tham chiếu CRC, ta làm như sau:
1. Tạo 1 mảng 1 chiều 256 phần tử
2. Duyệt từng phần tử trong bảng, gán giá trị của crc bằng index của phần tử đang xét
3. Duyệt từng bit trong crc đang xét, nếu bit đầu của crc là 0x01 thì dịch trái crc 1 bit và thực hiện hiện phép bù bit với 0x07, còn nếu không thì chỉ thực hiện dịch trái 1 bit mà thôi. Thực hiện với tất cả các bit của crc
4. Cập nhật lại giá trị crc mới vào bảng và duyệt tiếp các phần tử còn lại.
void CCRC8Dlg::isb_WiMAX_POM_gen_crc8_table()
{
uint16_t index_ui16;/*table index*/
uint8_t bit_ui8;/*bit counter*/
uint8_t crc_ui8;/* CRC result*/
for ( index_ui16 = 0; index_ui16 < 256; index_ui16++ )
{
crc_ui8 = index_ui16;
for ( bit_ui8 = 0; bit_ui8 < 8; bit_ui8++ )
{
if ( crc_ui8 & 0x80 )
crc_ui8 = ( crc_ui8 << 1 ) ^ ISB_WiMAX_POM_CRC8_POLYNOMIAL_K;
else
crc_ui8 = ( crc_ui8 << 1 );
}
isb_WiMAX_pommgr_info_str_g.crc8Table_ui8[index_ui16] = crc_ui8;
}
}
II.5. Các hàm CRC thường dùng và được tiêu chuẩn hóa
Các dạng mã kiểm soát lỗi CRC (cyclic redundancy check) được chia thành nhiều tiêu chuẩn, chúng không được tiêu chuẩn hóa thống nhất cho 1 thuật toán nào ở mỗi mức độ trên toàn cầu: có 3 đa thức CRC-12, ít nhất 8 biến thể có trong tài liệu của CRC-16, và 3 biến thể của CRC-32 được biết đến. Các đa thức thường được xem như không phải là tối ưu nhất có thể. Trong những năm từ 1993 đến 2004, Koopman, Castagnoli và một số nhà khoa học đã tiến hành tìm kiếm trong không gian các đa thức lên đến 16, và không gian 24 và 32 bit, tìm các ví dụ có hiệu suất tốt hơn nữa (trong các điều kiện quãng cách Hamming cho một bức tin có kích thước cho trước) so với các đã thức trong các giao thức trước đó, và xuất bản những kết quả tốt nhất trong số chúng với mục đích cải thiện năng tực tìm lỗi cho các tiêu chuẩn trong tương lai.
Far from being arbitrarily chosen, đa thức phổ biển CRC-32 , được IEEE giới thiệu và được dùng trong V.42, Ethernet, FDDI và ZIP và các filePNG cũng như nhiều ứng dụng khác, là một đa thức sinh ra từ mã Hamming và được chọn để tìm lỗi trong các kênh truyền thông. Dù vậy, nó còn có hiệu suất tốt hơn với đa thức Castagnoli CRC-32C sử dụng ở iSCSI trong các môi trường Internet SCSI.
Bảng dưới đây chỉ liệt kê những đa thức của những thuật toán đa dạng đang được sử dụng. Bất kỳ giao thức cá biệt.
Tên
Đa thức
Các biểu diễn: thông thường hoặc nghịch đảo (đảo của đảo)
CRC-1
x + 1 (hầu hết phần cứng; còn biết với tên parity bit)
0x1 or 0x1 (0x1)
CRC-4-ITU
x4 + x + 1 (ITU G.704, p. 12)
0x3 or 0xC (0x9)
CRC-5-ITU
x5 + x4 + x2 + 1 (ITU G.704, p. 9)
0x15 or 0x15 (0x1A)
CRC-5-USB
x5 + x2 + 1 (USB token packets)
0x05 or 0x14 (0x12)
CRC-6-ITU
x6 + x + 1 (ITU G.704, p. 3)
0x03 or 0x30 (0x21)
CRC-7
x7 + x3 + 1 (Các hệ thống viễn thông, MMC,SD)
0x09 or 0x48 (0x44)
CRC-8-ATM
x8 + x2 + x + 1 (ATM HEC)
0x07 or 0xE0 (0x83)
CRC-8-CCITT
x8 + x7 + x3 + x2 + 1 (1-Wire bus)
0x8D or 0xB1 (0xC6)
CRC-8-Dallas/Maxim
x8 + x5 + x4 + 1 (1-Wire bus)
0x31 or 0x8C (0x98)
CRC-8
x8 + x7 + x6 + x4 + x2 + 1
0xD5 or 0xAB (0xEA [3])
CRC-8-SAE J1850
x8 + x4 + x3 + x2 + 1
0x1D or 0xB8 (0x8E)
CRC-10
x10 + x9 + x5 + x4 + x + 1
0x233 or 0x331 (0x319)
CRC-11
x11 + x9 + x8 + x7 + x2 + 1 (FlexRay)
0x385 or 0x50E (0x5C2)
CRC-12
x12 + x11 + x3 + x2 + x + 1 (Các hệ thống viễn thông )
0x80F or 0xF01 (0xC07)
CRC-15-CAN
x15 + x14 + x10 + x8 + x7 + x4 + x3 + 1
0x4599 or 0x4CD1 (0x62CC)
CRC-16-Fletcher
Không phải một CRC; xem Fletcher's checksum
Sử dụng trong Adler-32 A & B CRC
CRC-16-CCITT
x16 + x12 + x5 +1 (X.25, V.41, CDMA, Bluetooth, XMODEM, HDLC,PPP, IrDA, BACnet; known as CRC-CCITT, MMC,SD)
0x1021 or 0x8408 (0x8810)
CRC-16-DNP
x16 + x13 + x12 + x11 + x10 + x8 + x6 + x5 + x2 + 1 (DNP, IEC 870, M-Bus)
0x3D65 or 0xA6BC (0x9EB2)
CRC-16-IBM
x16 + x15 + x2 + 1 (SDLC, USB, khác; còn được biết là CRC-16)
0x8005 or 0xA001 (0xC002)
CRC-24-Radix-64
x24 + x23 + x18 + x17 + x14 + x11 + x10 + x7 + x6 + x5 + x4 + x3 + x + 1 (FlexRay)
0x864CFB or 0xDF3261 (0xC3267D)
CRC-30
x30 + x29 + x21 + x20 + x15 + x13 + x12 + x11 + x8 + x7 + x6 + x2 + x + 1 (CDMA)
0x2030B9C7 or 0x38E74301 (0x30185CE3)
CRC-32-Adler
Không phải một CRC; xem Adler-32
xem Adler-32
CRC-32-IEEE 802.3
x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 (V.42, MPEG-2,PNG )
0x04C11DB7 or 0xEDB88320 (0x82608EDB)
CRC-32C (Castagnoli)
x32 + x28 + x27 + x26 + x25 + x23 + x22 + x20 + x19 + x18 + x14 + x13 + x11 + x10 + x9 + x8 + x6 + 1
0x1EDC6F41 or 0x82F63B78 (0x8F6E37A0 )
CRC-32K (Koopman)
x32 + x30 + x29 + x28 + x26 + x20 + x19 + x17 + x16 + x15 + x11 + x10 + x7 + x6 + x4 + x2 + x + 1
0x741B8CD7 or 0xEB31D82E (0xBA0DC66B)
CRC-64-ISO
x64 + x4 + x3 + x + 1 (HDLC — ISO 3309)
0x000000000000001B or 0xD800000000000000 (0x800000000000000D)
CRC-64-ECMA-182
x64 + x62 + x57 + x55 + x54 + x53 + x52 + x47 + x46 + x45 + x40 + x39 + x38 + x37 + x35 + x33 + x32+ x31 + x29 + x27 + x24 + x23 + x22 + x21 + x19 + x17 + x13 + x12 + x10 + x9 + x7 + x4 + x + 1 (as described in ECMA-182 p.63)
0x42F0E1EBA9EA3693 or 0xC96C5795D7870F42 (0xA17870F5D4F51B49)
II.6. Chương trình chạy
#include
#include
#include
main()
{
char m[64], p[32],fcs[32];
int i,j=-1,k;
// nhap chuoi nhi phan
a1: printf("\n nhap vao chuoi bit: "); gets(m);
int b=strlen(m); //do dai chuoi m
for(i=0; i<b; i++)
if(m[i]!='0'&&m[i]!='1')
{
printf("\n chuoi khong hop le: \n");
goto a1;
break;
}
// nhap chuoi bit cua da thuc sinh
a2: printf("\n nhap vao chuoi sinh: "); gets(p);
int r=strlen(p); // do dai chuoi sinh
for(i=0; i<r; i++)
if(p[i]!='0'&&p[i]!='1')
{
printf("\n chuoi khong hop le: \n");
goto a2;
break;
}
int d=b+r-1; //do dai chuoi Mx2^r
//them r-1 bit 0 vao chuoi ban dau
for(i=b; i<d; i++)
m[i]=48;
// chuyen ma ASCII thanh so nguyen
for(i=0; i<d; i++)
if (m[i]==49)
m[i]=1;
else
m[i]=0;
for(i=0; i<r; i++)
if (p[i]==49)
p[i]=1;
else
p[i]=0;
//luu chuoi Mx2^r
for(i=0; i<d; i++)
fcs[i]=m[i];
//in day Mx2^r
printf("\n day Mx2^r: ");
for(i=0;i<d;i++)
printf("%d", fcs[i]);
//tinh toan FCS
for(i=0; i<=d-r; i++)
{
if(fcs[i]==1)
{
k=-1;
for(j=i; j<i+r; j++)
{
k++;
fcs[j]=fcs[j]^p[k];
}
}
else
fcs[i]=0;
printf("\nday Mx2^r sau khi dich lan %d la: ", i);
for (int t=0; t<d; t++)
printf("%d", fcs[t]);
printf("\n");
}
//in FCS
printf("\n so du FCS: ");
for(i=0; i<d; i++)
printf("%d", fcs[i]);
//cong FCS voi chuoi Mx2^r
for(i=0; i<d; i++)
m[i]=m[i]|fcs[i];
//in ket qua
printf("\n day T: ");
for(i=0; i<d; i++)
printf("%d", m[i]);
getchar();
}
II.7. Ứng dụng thực tế
Chương trình ứng dụng lập trình của thuật toán CRC được áp dụng rất nhiều trong thực tế và có một ý nghĩa quan trọng trong tin học.
a. Chương trình tính toán CRC kiểm tra "sự thừa theo chu kỳ" giá trị cho các tập tin bạn chỉ định. Trong thực tế, nó thực hiện một phép tính phức tạp trên tất cả các byte trong tập tin, tạo ra một số duy nhất cho các tập tin trong câu hỏi. Nếu quá nhiều như là một byte duy nhất trong tập tin đang được kiểm tra đã được thay đổi, giá trị dự phòng kiểm tra chu kỳ cho tập tin đó cũng sẽ thay đổi.
b. Một chương trình CRC hoàn thiện
Báo cáo mỗi thư mục sẽ hiển thị các tập tin checksum sự thừa cyclic (CRC-32) và hiển thị các thư mục CRC-32 checksum. Việc tổng kiểm tra sự thừa cyclic (CRC) sẽ nhanh chóng xác định xem hai tập tin hoặc thư mục giống hệt nhau.
Việc tổng kiểm tra sự thừa cyclic (CRC) có thể được sử dụng để kiểm tra xem hai tập tin trên hai máy tính là giống hệt nhau Mặc dù hai máy tính không phải là trên cùng một mạng 1. Khởi Directory Báo cáo về máy tính 1 với CRC checksum trên 2. Khởi Directory Báo cáo trên máy tính 2 với CRC checksum trên Nếu hai file có cùng một CRC checksum sau đó hai tập tin trùng.Các Cyclic Redundancy Checksum (CRC) là một chức năng mà các quy trình từng byte của một tập tin.Việc thay đổi, dù nhỏ, với sản xuất một số CRC khác nhau.Chức năng CRC checksum được sử dụng bởi nhiều chương trình, như Zip, để xác minh các tập tin.Việc tổng kiểm tra CRC là chủ yếu được sử dụng để Tìm và thay thế các file trùng lặp.Một phương pháp nhanh chóng vượt qua nhiều loại bỏ không trùng lặp Tính năng này đã được thử nghiệm rộng rãi trên các ổ đĩa mạng có chứa hơn 450.000 tác phẩm với 140 buổi biểu diễn.Báo cáo thư mục nhiều hơn là chỉ một chương trình dự phòng cyclic CRC checksum.Chức năng CRC checksum được tích hợp cùng với nhiều tính năng khác file bảo trì.
PHẦN III: Tổng kết
4.1.Tự đánh giá kết quả báo cáo đề tài.
Đề tài của nhóm em được hoàn thành ở mức cơ bản và cũng phát triển rộng thêm ở mộ