25/05/2018, 09:37

Mã phát hiện lỗi

Nhằm phát hiện lỗi người ta thêm vào dòng dữ liệu các bit kiểm tra. Phương pháp này gọi chung là kiểm tra lỗi dư thừa (Redundancy error check methode), từ dư thừa được dùng vì các bit thêm vào không phải là phần thông tin cần gửi đi. ...

Nhằm phát hiện lỗi người ta thêm vào dòng dữ liệu các bit kiểm tra. Phương pháp này gọi chung là kiểm tra lỗi dư thừa (Redundancy error check methode), từ dư thừa được dùng vì các bit thêm vào không phải là phần thông tin cần gửi đi.

- Dùng kiểm tra chẵn lẻ để dò ra một bit sai:

Đây là phương pháp kiểm tra đơn giản nhất, bằng cách thêm vào sau chuỗi dữ liệu (thường là một ký tự) một bit sao cho tổng số bit 1 kể cả bit thêm vào là số chẵn (hoặc lẻ), ở máy thu kiểm tra lại tổng số này để biết có lỗi hay không. Phương pháp đơn giản nên chất lượng không cao, nếu số lỗi là chẵn thì máy thu không nhận ra.

- Dùng kiểm tra chẵn lẻ để dò sai hai bit:

Vì mỗi lần thực hiện kiểm tra chẵn lẻ cho phép dò ra một bit lỗi nên ta có thể nghĩ rằng nếu thực hiện nhiều phép kiểm tra đồng thời cho phép dò được nhiều lỗi.

Thí dụ, để dò ra 2 lỗi của một chuỗi dữ liệu có thể thực hiện hai phép kiểm tra, một với các bit chẵn và một với các bit lẻ.

Cho chuỗi dữ liệu: 01101000

Lần lượt thực hiện kiểm tra chẵn với các bit ở vị trí 1, 3, 5, 7 và các bit ở vị trí 2, 4, 6, 8. Gọi P1 và P2 là các bit kiểm tra:

P1=0+1+1+0 = 0

và P2=1+0+0+0 = 1.

Chuỗi dữ liệu phát: 01101000 01.

Máy thu dò ra lỗi khi 2 bit liên tiếp bị sai. Tuy nhiên, nếu hai bit sai đều là 2 bit chẵn (hoặc 2 bit lẻ) thì máy thu cũng không dò ra.

- Dùng kiểm tra chẵn lẻ để dò ra một chuỗi bit sai:

Đôi khi nhiễu làm sai cả một chuỗi dữ liệu (ta gọi là burst errors), để dò ra được chuỗi bit sai này, người ta bắt chước cách lưu và truyền dữ liệu của máy tính (lưu từng bit của một byte trong các chip riêng để truyền trên các đường khác nhau và nơi nhận sẽ tái hợp) để thực hiện việc kiểm tra. Chuỗi dữ liệu sẽ được chia ra thành các khung (frames), thực hiện kiểm tra cho từng khung, thay vì phát mỗi lần một khung, người ta phát các tổ hợp bit cùng vị trí của các khung, nhiễu có thể làm hỏng một trong các tổ hợp này và chuỗi bit sai này có thể được nhận ra ở máy thu.

Thí dụ dưới đây minh họa cho việc kiểm tra phát hiện chuỗi dữ liệu sai:

Gửi Nhận
Số khung(hàng)12345678910Số cột 0 1 1 0 11 0 0 0 10 1 1 1 01 1 0 0 10 1 0 1 01 0 1 1 10 1 1 0 00 0 1 1 11 0 0 1 11 1 0 0 01 2 3 4 5 Bit parity của từng hàng10110001106 →Nhiễu tác đông vàocột 4, làm cho tất cả các bit = 0→ Số khung(hàng)12345678910Số cột 0 1 1 0 11 0 0 0 10 1 1 0 01 1 0 0 10 1 0 0 01 0 1 0 10 1 1 0 00 0 1 0 11 0 0 0 11 1 0 0 01 2 3 4 5 Bit parity của từng hàng101*10*0*01*1*06

Máy thu dò ra các khung có lỗi (các bit parity có dấu *) nhưng không xác định được cột nào bị sai do đó phải yêu cầu máy phát phát lại tất cả các cột

- Kiểm tra khối:

Một cải tiến của kiểm tra chẵn lẻ là kiểm tra khối (Block Check Character, BCC). Bản tin được viết thành khối và việc kiểm tra chẵn lẻ được thực hiện theo cả 2 chiều dọc (Vertical Redundancy Check, VRC) và ngang (Longitudinal Redundancy Check, LRC)

Gọi các bit của mỗi ký tự là bij (i=1,....., n là thứ tự các bit trong ký tự ; j=1,...., m là thứ tự của ký tự)

Rj là bit parity của ký tự thứ j, giả sử chọn parity chẵn, ta có :

Rj = b1j + b2j + ...........+ bnj

Ci là bít parity của tất cả bít thứ i

Ci = bi1 + bi2 + ...........+ bim +

Tập hợp các bit Ri (j = 1,.......,m) dùng kiểm tra chiều dọc và tập hợp các bit Ci (i = 1,......,n) dùng kiểm tra chiều ngang.

(H 3.1) cho ta dạng của khối dữ liệu có thực hiện kiểm tra chẵn theo chiều ngang và dọc.

bit 1 2 . . . . . . . bit n Parity

Character 1 B11 B21 . . . . . . . Bn1 R1 10110111 VRC
Character 2 B12 B22 . . . . . . . Bn2 R2 11010111
001110101111000010001011
Character m B1m B2m . . . . . . . bnm Rm 01011111
Parity check char. C1 C2 . . . . . . . Cn Cn+1 01111110 LRC

(H 3.1)

Phương pháp kiểm tra khối cho phép phát hiện và sửa một lỗi vì xác định được vị trí của lỗi đó, chính là giao điểm của hàng và cột có bit sai.

Máy thu có khả năng phát hiện hai lỗi sai trên cùng một hàng hoặc cột nhưng không xác định được vị trí bit lỗi. Ví dụ hai bit 1 và 3 của ký tự thứ nhất cùng sai thì bit kiểm tra VRC không phát hiện được nhưng bit LRC thì thấy ngay. Nếu bây giờ có thêm các bit 1 và 3 của ký tự thứ 5 cùng sai thì máy thu sẽ không phát hiện được, như vậy cũng còn trường hợp không phát hiện được lỗi nếu số lỗi là một số chẵn theo những vị trí xác định nào đó, tuy nhiên trường hợp này rất hiếm xảy ra.

Tóm lại, dùng kiểm tra chẵn lẻ cho phép phát hiện lỗi trong một số trường hợp, tuy nhiên hiệu suất phát sẽ bị giảm và chỉ được dùng trong các hệ thống có vận tốc truyền thấp (bất đồng bộ). Trong các hệ thống truyền đồng bộ người ta hay sử dụng mã CRC , mã này cho phép dò lỗi rất hiệu quả và hiệu suất truyền cũng cao.

Để cải thiện hơn nửa việc kiểm tra lỗi người ta dùng phương pháp kiểm tra dư thừa theo chu kỳ (Cyclic Redundancy Check, CRC)

Nguyên tắc tạo mã CRC : Xét khung dữ liệu gồm k bit và nếu ta dùng n bit cho khung kiểm tra FCS (Frame check sequence) thì khung thông tin kể cả dữ liệu kiểm tra gồm (k+n) bit sao cho (k+n) bit này chia đúng cho một số P có (n+1) bit chọn trước (dùng phép chia Modulo-2). Ở máy thu khi nhận được khung dữ liệu, lại mang chia cho số P này và nếu phép chia đúng thì khung dữ liệu không chứa lỗi

* Nhắc lại một số tính chất của phép toán Mod-2 :

- Phép cộng Mod-2 là phép cộng nhị phân không nhớ, dưới đây là thí dụ về phép cộng và phép nhân

1111 11001

+ 1010 x 11

0101 11001

11001

101011

- Phép cộng Mod-2 được thực hiện bởi cổng EX-OR

- Phép trừ Mod-2 giống như phép cộng

- Nhân Mod-2 một số với 2n tương ứng với dời số đó n bit về bên trái và thêm n bit 0 vào bên phải số đó, thí dụ 11001* 23 = 11001000

- Phép chia Mod-2 được thực hiện giống như phép chia thường nhưng nhớ là phép trừ trong khi chia được thực hiện như phép cộng.

Xác định mã CRC dùng thuật toán Mod-2

Gọi T = (k+n) bit là khung thông tin được phát , với n < k

M = k bit dữ liệu, k bit đầu tiên của T

F = n bit của khung FCS, n bit cuối của T

P = (n+1) bit, số chia trong phép toán

Số T được tạo ra bằng cách dời số M sang trái n bit rồi cộng với số F :

T = 2nM + F

Chia số2nM cho P ta được :

2n

Q là số thương và R là số dư

Vì phép chia thực hiện với số nhị phân nên số dư luôn luôn ít hơn số chia 1 bit.

Ta dùng số dư này làm số F, nghĩa là :

T = 2nM + R.

Ở máy thu khi nhận được khối dữ liệu, mang chia cho P, kết quả số dư sẽ = 0 :

Vì R + R = 0 nên T/P = Q

Như vậy dùng số dư R của phép chia 2nM cho P làm ký tự kiểm tra trong khung FCS thì chắc chắn T sẽ chia đúng cho P nếu bản tin không có lỗi.

Thí dụ:

Cho M = 1010001101 (10 bit)

P = 110101 (6 bit)

Số phải tìm R (5 bit) cho khung FCS được xác định như sau :

- Nhân M với 25 cho : 101000110100000

- Thực hiện phép chia cho P

1101010110

110101 

110101

0111011

110101

00111010

110101

00111110

110101

00101100

110101

0110010

110101

0001110  R

Ta có R = 01110, cộng với 25M, sẽ cho số T phát đi là :

T = 101000110100000 + 01110 = 101000110101110

Nếu bản tin không có lỗi T phải chia đúng cho P.

Thực hiện phép chia T/P ta thấy số dư = 0

Tóm lại, để có một khung FCS n bit , người ta phải dùng một số P có n+1 bit để tạo số R có n bit dùng cho khung FCS. P được gọi là đa thức sinh (generator polynomial), dạng của nó do các giao thức qui định, tổng quát P phải có bit đầu và bit cuối là bit 1.

Dùng phép biểu diễn đa thức

Để thấy quá trình hình thành mã CRC, ta có thể dùng phép biểu diễn một số nhị phân dưới dạng một đa thức của biến x với hệ số là các số nhị phân và bậc của x là giá trị chỉ vị trí của số nhị phân đó.

Ví dụ số nhị phân 110101 có thể biểu diển bởi

1.x5 + 1.x4 + 0.x3 + 1. x2 + 0.x1 + 1.x0 = x5 + x4 + x2 + 1

Chú ý mã số n bit cho bậc cao nhất của đa thức là n-1

Quá trình hình thành mã CRC thực hiện như sau :

- Gọi M là đa thức biểu diễn thông tin cần truyền

P là đa thức sinh, bậc n (chứa n+1 bit)

Thực hiện phép chia

xn

Khung thông tin truyền đặc trưng bởi

T(x) = xn M(x) + R(x)

Lưu ý là nhân M(x) với xn tương đương với việc dời M(x) sang trái n bit

- Ở máy thu thực hiện phép chia T(x) cho P(x) số dư phải bằng không

Lấy lại thí dụ trên, bản tin 1010001101 tương ứng với đa thức

M(x) = x9 + x7 + x3 + x2 +1

Số chia P = 110101 (6 bít) tương ứng với đa thức

P(x) = x5 + x4 + x2 +1

x5M(x) = x14 + x12 + x8 + x7 + x5

Thực hiện phép chia :

x 9 + x 8 + x 6 + x 4 + x 2 +x

x5 + x4 + x2 +1  x14 + x12 + x8 + x7 + x5

x14 + x13 + x11 + x9

x13 + x12 + x11 + x9 + x8 + x7 + x5

x13 + x12 + x10 + x8

x11 + x10 + x9 + x7 + x5

x11 + x10 + x8 + x6

x9 + x8 + x7 + x6 + x5

x9 + x8 + x6 +x4

x7 + x5 + x4

x7 + x6 + x4 + x2

x6 + x5 + x2

x6 + x5 + x3 + x

x3 + x2 + x = R(x)

R(x) = x3 + x2 + x tương ứng với 01110

Khả năng dò sai của mã CRC

Một lỗi xảy ra ở một vị trí nào đó trong khung dữ liệu làm đảo bit ở vị trí đó của khung, điều này tương đương với phép tính EX-OR bit đó và bit 1 (vì 0+1=1 và 1+1=0).

Nếu gọi E là một khung có số lượng bit bằng với khung dữ liệu, trong đó chỉ các vị trí của bit lỗi = 1 và các bit khác = 0 thì khung thông tin Tr nhận được có thể viết.

Tr = T + E.

Thí dụ:

T = 11010111010

Dạng đa thức: T(x) = x10 + x9 + x7 + x5 + x4 + x3 + x

Giả sử bản tin sai ở các bit x7 , x5 và x4

Khung E có dạng: E = 00010110000

E(x) = x7 + x5 + x4

Khung dữ liệu nhận được: Tr = 11000001010

Tr(x) =x10 + x9 + x3 + x

Lưu ý phép cộng Modulo 2, tương ứng với phép toán EX-OR, nên x7+x7=(1+1)x7 = 0

Ta có

Máy thu không nhận ra lỗi khi nào Tr(x) chia đúng cho P(x), hay chỉ khi E(x) chia đúng cho P(x).

Vậy với điều kiện nào thì E(x) chia hết cho P(x) ?

Ta sẽ xét một số trường hợp cụ thể:

@- Giả sử bản tin chỉ sai một bit, đa thức E(x) có dạng xi, i là một số nguyên, E(x) chia đúng cho P(x) chỉ khi P(x) cũng có dạng xn. Người ta đã chọn P(x) có ít nhất là 2 số hạng nên E(x) không thể chia đúng cho P(x). Vậy

Mã CRC luôn luôn cho phép máy thu dò ra một bit sai.

@- Giả sử bản tin sai một chuỗi, nhưng có tổng số bit sai là số lẻ: đa thức E(x) chứa số lẻ bit 1 nên E(1) =1. Mặt khác, giả sử (x+1) là thừa số của P(x), ta có thể viết P(x) = (x+1)*H(x), H(x) là một đa thức. Ta cũng giả sử lỗi này không được dò ra, nghĩa là E(x) chia đúng cho P(x), hay E(x) = P(x)*K(x). Thay P(x) = (x+1)*H(x) vào E(x) được E(x) = (x+1)*H(x)*K(x), biểu thức này cho E(1) = 0. Điều này trái với giả thiết ở trên, hay nói cách khác, máy thu sẽ dò ra lỗi nếu ta chọn P(x) sao cho chia đúng cho (x+1). Vậy

Máy thu sẽ luôn luôn dò ra lỗi gồm nhiều bit và có tổng số bit lỗi là số lẻ nếu ta chọn P(x) chia đúng cho (x+1).

@-Giả sử nhiễu làm sai một đoạn dữ liệu có chiều dài m bậc n của P(x)

Giả sử chuỗi bit sai có vị trí từ thứ i đến thứ i+m-1, E(x) có dạng:

E(x) = xi+m-1 + . . . . +xi = xi*(xm-1+ . . . +1)

P(x) không là thừa số của xi nên E(x) chỉ chia đúng cho P(x) khi xm-1+ . . . +1 chia đúng cho P(x). Vì m ≤ n hay m-1<n nên phép chia trên không thể là phép chia đúng. Vậy

Máy thu luôn luôn dò ra lỗi nếu chuỗi dữ liệu sai có chiều dài bậc của P(x)

@-Đoạn dữ liệu sai có chiều dài m >n

Từ kết quả trên

Nhưng bây giờ m-1 ≥ n nên xm-1+ . . . +1 có thể chia đúng cho P(x). Vậy vấn đề là có bao nhiêu cơ hội để điều này xảy ra.

- Trường hợp m-1 = n hay (m=n+1). Vì bậc của P(x) là n nên để có phép chia đúng P(x) phải có dạng xn+ . . . . . +1 với các số hạng giữa xn và 1 phải hoàn toàn giống với các số hạng của xm-1+ . . . . . +1 thì máy thu không dò được lỗi. Có n-1 số hạng giữa xn và 1 nên có 2n-1 tổ hợp và nếu các tổ hợp này có xác suất xảy ra như nhau thì xác suất máy thu không nhận được lỗi sẽ là 1/2n-1.

- Trường hợp m>n+1, ta chấp nhận kết quả xác suất này là 1/2n.

Lấy thí dụ mã CRC-32 (n=32), xác suất không dò ra một lỗi có chiều dài >33 bit là 1/2.1032 (tương đương với khả năng dò ra lỗi là 99,99999998%).

Tóm lại với n càng lớn việc máy thu không dò ra lỗi càng rất khó xảy ra.

Mạch tạo mã CRC.

Thuật toán mod 2 được thực hiện bởi cổng EX-OR.

Dời bit được thực hiện bởi thanh ghi dịch.

Quan sát phép tính chia mod.2 của số 2nM cho P(x) để có R(x) ta thấy đây là sự kết hợp của sự dời bit của số 2nM với phép cộng Mod.2 của số P(x). Trong thí dụ trên, để tạo mã CRC với P(x) = 110101, người ta dùng mạch (H 3.2): Cho chuỗi dữ liệu là số 2nM (gồm 15 bit, 101000110100000) vào mạch, sau 15 lần dời bit, kết quả trên các thanh ghi dịch chính là R(x). Mạch tạo mã trong trường hợp này gồm 5 thanh ghi dịch, ký hiệu A(x5), B(x4), C(x3), D(x2), E(x) .

Mạch tạo mã CRC được thực hiện như sau:

- Thanh ghi dịch chứa n bit, bằng với chiều dài của khung FCS.

- Có nhiều nhất n cổng EX-OR.

- Sự có mặt hay không của cổng EX-OR tương ứng với sự có mặt của số hạng lũy thừa bậc n trong đa thức P(x) (Riêng bậc cao nhất (n) của đa thức không kể )

(H 3.2 )

A B C D E Dữ liệu vào
Bắt đầuBước 1Bước 2Bước 3Bước 4Bước 5Bước 6Bước 7Bước 8Bước 9Bước 10Bước 11Bước 12Bước 13Bước 14Bước 15 000001*1010101100 000010*1111110101 0001011111101011 001010*0101111011 0101001011110110 1010 00* Bản tin để gửi1101000 5 bit 0 thêm vào00

²

số dư

- Trong thí dụ trên P =110101 = x5 + x4 + x2 + 1, nên mạch chứa ba cổng EX-OR ở các vị trí tương ứng với 1, x2 và x4 (x5 ứng với thanh ghi dịch cuối cùng FFA). Đường hồi tiếp từ x5 về x4 ­, x2 và 1 (x0) để thực hiện phép cộng Mod-2 với số P(x) như nói trên.

- Trong 5 bước đầu tiên, các bit có trọng số lớn của M(x). 2n xuất hiện ở ngã ra các FFD một cách bình thường.

- Từ bước thứ 6 các kết quả phải kể đến tác dụng của cổng EX-OR, thí dụ ở bước thứ 6 ở ngõ ra E chính là cộng Mod-2 của tín hiệu vào (bit 0) và tín hiệu ngã ra A trước đó (bit 1), tức thực hiện EX-OR hai bit 0 và 1 ta được bit 1. Ngã ra D (bit 0) EX-OR với ngã ra A (bit 1) để được bit 1 ở ngã ra C. Ngã ra B(bit 0) EX-OR với ngã ra A (bit 1) để được bit 1 ở ngã ra A. Trên hình vẽ các bit EX-OR với bit ở ngã ra A được đánh dấu.

Tương tự như thế, sau 15 lần dịch (bước 15), dữ liệu ở ngã ra các FF chính là mã CRC (số dư R = 01110). Ngã ra A là MSB.

Có 4 đa thức P(x) được dùng để tạo mã CRC thông dụng:

CRC_12 = x12 +x11 + x3 + x2 + x + 1

CRC_16 = x16+x15 + x2 + 1

CRC_CCITT = x16+x12 + x5 + 1

CRC_32 = x32+ x26+ x23+ x22 + x16+ x12 + x11+ x10+ x8+ x7 + x5 + x4 + x2+ x +1

CRC_12 dùng truyền với ký tự 6 bit và khung FCS dài 12 bit.

CRC_16 & CRC_CCITT dùng truyền ký tự 8 bit và khung FCS dài 16 bit. (ở Mỹ và Âu châu).

CRC_32 Dùng trong mạng cục bộ (LAN) và một số ứng dụng của DOD (Department Of Defense).

Mã Hamming là một bước phát triển của kiểm tra chẵn lẻ và có khả năng sửa sai do xác định được vị trí lỗi. Số lượng bit của mã Hamming tùy thuộc số lượng bit của chuỗi dữ liệu. Ta có thể lý luận như sau để xác định số lượng bit của mã Hamming.

Gọi m là số bit của chuỗi dữ liệu và n là số bit của mã Hamming, tổng số bit phát đi là m+n

- Với n = 1 ta xác định được 1 trong 2 kết quả : chuỗi dữ liệu sai hoặc đúng nhưng không biết vị trí lỗi.

- Với n = 2, 1 trong 4 trường hợp xảy ra: 2 phép kiểm tra đều cho kết quả đúng, 2 phép kiểm tra đều cho kết quả sai, phép kiểm tra thứ nhất sai, phép kiểm tra thứ hai đúng và ngược lại. 4 trường hợp này cho phép kết luận được 1 bit sai ở 1 trong 3 vị trí.

- Với n=3, có 8 khả năng xảy ra và ta có thể kết luận được 1 bit sai ở 1 trong 7 vị trí.

- Với số n bất kỳ, có 2n khả năng xảy ra và ta có thể kết luận được 1 bit sai ở 1 trong 2n -1 vị trí.

Vậy để có thể phát hiện 1 lỗi tại 1 vị trí cụ thể thì số n nhỏ nhất được chọn phải thỏa:

2 n - 1 Ù m + n hay 2 n Ù m + n + 1

Các bit của mã Hamming chèn vào vị trí 2n và dùng cho kiểm tra chẵn lẻ. Các bit khác là bit thông tin (dữ liệu).

Dưới đây là một ví dụ để thấy cách xác định mã Hamming:

Giả sử chuỗi dữ liệu cần truyền gồm 4 bit như sau :

1 0 1 0

Với m = 4 , ta chọn n = 3, bất đẳng thức trên được thỏa

Gọi các bit của mã Hamming là H1 H2 và H4 (1, 2, 4 là các vị trí mà ta sẽ đặt 3 bit của mã Hamming vào dòng dữ liệu). Gọi các bit dòng dữ liệu là X3, X5, X6, X7.

Tổ hợp các bit dữ liệu và bit mã, ta đươc

1 2 3 4 5 6 7

H1 H2 X3 H4 X5 X6 X7

Giả sử ta chọn Parity chẵn, các bit mã sẽ được xác định như sau:

H1 X3 X5X7 = 0

H1 = X3 X5X7 =1  ( 0  0 ) = 1  0 = 1

Tương tự:

H2 = X3 X6X7 =1  (1  0 ) = 1  1 = 0

H4 = X5 X6X7 =0  (1  0 ) = 0  1 = 1

Bản tin bao gồm bit mã trở thành: 1 0 1 1 0 1 0

Ở máy thu để kiểm tra người ta thực hiện các phép toán:

C1 = H1 X3 X5X7

C2 = H2 X3 X6X7

C4 = H4 X5 X6X7

Nếu C1= C2 = C4 = 0, không có lỗi xảy ra

Nếu C1 = 1, C2 = C4 = 0, một trong các bit ở vị trí 1, 3, 5, 7 bị lỗi. Nhưng C2 = C4 = 0 có nghĩa là các bit ở vị trí 2, 3, 6, 7 và 4, 5, 6, 7 đã đúng. Vậy bit sai phải ở vị trí 1

Lý luận tương tự ta có các trường hợp khác. Thí dụ nếu C1= C2 = C4 = 1 thì bit lỗi là bit ở vị trí 7

Thí dụ bản tin nhận được là 1 0 1 1 1 1 0

Mạch dò sai sẽ tính C1 , C2 , C4 như sau:

C1 = H1 X3 X5X7 = 1  1  1  0 = 1

C2 = H2 X3 X6X7 = 0  1  1  0 = 0

C4 = H4 X5 X6 X7 = 1  1  1  0 = 1

Vì chỉ bit X5 thuộc cả C1 và C4 nên bit sai là bit thứ 5

Quan sát tổ hợp C4 C2 C1 ta thấy C4 C2 C1 = 101 = (5)10 . Như vậy giá trị có được của tổ hợp này cho ta biết vị trí bit sai cần sửa chữa.

Nếu tổ hợp này bằng 0 chứng tỏ bản tin nhận đúng.

Mã Hamming có thể được phát triển để dò ra hai bit sai và sửa được một bit lỗi.

0