Mã Hamming là một mã sửa lỗi tuyến tính được đặt tên theo tên của người phát minh ra nó, Richard Hamming. Mã Hamming có thể phát hiện và sửa được sai cho một số bit nhất định
Nguyên tắc:
Một từ mã Hamming gồm m bit nhị phân dữ liệu và p bit kiểm tra chẵn lẻ (2p -1 ≥ m + p), p
bit kiểm tra được bố trí tại các vị trí thích hợp để phát hiện chính xác vị trí lỗi là các số mũ của 2 ví dụ: 20, 21, 22,…
Tất cả các vị trí bit khác được dùng cho dữ liệu sẽ được mã hóa. (các vị trí 3, 5, 6, 7, …
Mỗi bit chẵn lẻ tính giá trị chẵn lẻ cho một số bit trong m bit. Vị trí của bit chẵn lẻ quyết định
chuỗi các bit mà nó luân phiên kiểm tra và bỏ qua
Vị trí 1 (n=1): bỏ qua 0 bit(n-1), kiểm 1 bit(n), bỏ qua 1 bit(n), kiểm 1 bit(n), bỏ qua 1 bit(n),
v.v. → p1 (20)
Vị trí 2(n=2): bỏ qua 1 bit(n-1), kiểm 2 bit(n), bỏ qua 2 bit(n), kiểm 2 bit(n), bỏ qua 2 bit(n),
v.v. → p2 (21)
Vị trí 4(n=4): bỏ qua 3 bit(n-1), kiểm 4 bit(n), bỏ qua 4 bit(n), kiểm 4 bit(n), bỏ qua 4 bit(n), v.v. → p3 (22)
Vị trí 8(n=8): bỏ qua 7 bit(n-1), kiểm 8 bit(n), bỏ qua 8 bit(n), kiểm 8 bit(n), bỏ qua 8 bit(n),
v.v. → p4 (23)
Vị trí 16(n=16): bỏ qua 15 bit(n-1), kiểm 16 bit(n), bỏ qua 16 bit(n), kiểm 16 bit(n), bỏ qua 16
bit(n), v.v. → (24)
Vị trí 32(n=32): bỏ qua 31 bit(n-1), kiểm 32 bit(n), bỏ qua 32 bit(n), kiểm 32 bit(n), bỏ qua 32 bit(n), v.v. → (25)
và tiếp tục như trên.
Xác định vị trí lỗi bằng cách lấy mudul 2 (xor) của các bit chẵn lẻ của dữ liệu sau và trước khi truyền nếu = 0 thì không có lỗi, ngược lại thì vị trí lỗi là kết của phép môdul 2 chuyển sang hệ thập phân.
b) Ví dụ 1: cho m bit dữ liệu cần truyền là: 0110101 hãy chèn các bit cần thiết vào theo
phương pháp mã sửa sai Hamming. (cho biết dãy truyền từ phải sang trái →)
Giải:
- m = 7, p = 4 (2p -1 ≥ 7 + 4) các bit p1, p2, p3, p4 được bố trívào các vị trí 1,2,4,8 - Các vị trí 3,5,6,7,9,10,11 là các bit dữ liệu
- Xác định p1, p2, p3, p4 theo thuật toán kết quả là: 1000 p1= 01011 = 1 (xor)
p2= 01001 = 0 p3= 110 = 0
CHƯƠNG 4: XỬ LÝ SỐ LIỆU TRUYỀN
43 p4= 101 = 0
- Rải các bit vừa tính được vào trong xâu gốc ta được xâu cần truyền là: 10001110010
Xác định vị trí bit lỗi như sau:
- Giả sử sau khi truyền nhận được dãy nhị phân là: 10001100100.
- Bằng cách xác định các bit chẵn lẻ p1, p2, p3, p4 như trên ta được: p1=0, p2=1, p3=0,
p4=1
- Thực hiện phép XOR các bit chẵn lẻ trước và sau khi truyền ( chú ý phải viết ngược
CHƯƠNG 4: XỬ LÝ SỐ LIỆU TRUYỀN 44 p4 p3 p2 p1 1 0 1 0 XOR 0 0 0 1 1 0 1 1 = 11(10)→vị trí lỗi là 11
c) ví dụ 2: Cho chuỗi bit gốc m = 1101100111, hãy chèn các bit cần thiết vào theo
phương pháp mã sửa sai Hamming. (cho biết dãy truyền từ trái sang phải )
Giải:
- m = 10, p = 4 (24 -1 > 10 + 4) các bit p1, p2, p3, p4 được bố trí vào các vị trí 1,2,4,8 - Các vị trí 3,5,6,7,9,10,11,12,13,14 là các bit dữ liệu
- Xác định p1, p2, p3, p4 theo thuật toán kết quả là: p1= 110011 = 0
p2= 110111 = 1 p3= 110110 = 0 p4= 011011 = 0
Rải các bit vừa tính được vào trong xâu gốc ta được xâu cần truyền là: 1 1 0 1 1 0 0 0 1 1 0 1 1 0
Giả sử sau khi truyền xâu nhận được là: 1 1 0 1 1 0 0 1 1 1 0 1 1 0 hãy xác định vị trí lỗi
Tìm p1, p2, p3, p4 của xâu nhận: P1 = 111011 = 1 P2 = 111111 = 0 P3 = 111011 = 1 P4 = 011011 = 0 - Vị trí lỗi là p4 p3 p2 p1 0 1 0 1 Xor 0 0 1 0 0 1 1 1 → Vị trí lỗi là 7 4.3 NÉN SỐ LIỆU 4.3.1 Khái quát
Nội dung thông tin truyền đi bao gồm dữ liệu gốc dưới dạng chuỗi ký tự có chiều dầi cố định. Trong đó dữ liệu được nén trước khi truyền đi, nén dữ liệu là một việc làm thiết yếu trong các
CHƯƠNG 4: XỬ LÝ SỐ LIỆU TRUYỀN
45
dịch vụ truyền dẫn công cộng, ví dụ truyền qua mạng PSTN, vì trong các mạng các mạng như vậy việc tính cước dựa vào thời gian và cự ly truyền. .
Trong thực tế chúng ta có thể dùng một loạt các giải thuật nén khác nhau, mỗi giải thuật sẽ phù hợp với một loại dữ liệu. Vài modem thông minh sẽ cung cấp đặc trưng nén thích nghi tự động thực hiện các giải thuật nén phù hợp với loại dữ liệu đang được truyền
4.3.2 Nén nhờ đơn giản mã cho các chữ số (Packed Decimal)
Khi dữ liệu chỉ bao gồm các ký tự số học đang được truyền, chúng ta có thể tiết kiệm đáng kể
bằng cách giảm số bit trên mỗi ký tự từ 7 xuống 4 thông qua mã BCD, thay cho mã ASCII vì
các số từ 0 –9 đều có 3 bit cao là 011 (thực tế 3 bit này dùng để phân biệt giữa ký tự là số và
không phải là số). Do vậy nếu dữ liệu chỉ là các ký tự số thì 3 bit này là dư thừa
4.3.3 Nén theo mã hóa quan hệ
Một phương pháp khác được sử dụng khi truyền dữ liệu số học kế tiếp chỉ khác nhau phần
nhỏ về giá trị là chỉ gửi lượng khác nhau giữa các giá trị này cùng với một giá trị tham khảo. Điều này được gọi là mã hóa quan hệ và nó có thể đem lại hiệu quả đặc biệt trong các ứng dụng ghi nhân dữ liệu.
Ví dụ: nếu giám sát từ xa mục nước của dòng sông thường đọc mức nước theo các khoảng thời gian định trước . để tối thiểu thời gian cần truyền thay vì truyền giá trị chỉ mưc nước
tuyệt đối, chúng ta chỉ cần truyền đi các giá trị khác nhau.
4.3.4 Nén bằng cách bỏ bớt các ký tự giống nhau (mã hoá độ dài loạt Run-Length Encoding)
Thông thường dữ liệu được truyền thường xuất hiện chuỗi lặp lại các ký tự giống nhau. Thiết bị điều khiển tại máy phát sẽ quét nội dung của dữ liệu trước khi truyền nếu gặp một chuỗi ký tự liên tiếp giống nhau thì chúng sẽ được thay thế bởi một cặp số và ký tự.
Ví dụ, xét chuỗi sau: AAAABBBAABBBBBCCCCCCCCDABCBAAABBBBCCCD
Chuỗi này gồm bốn chữ A theo sau bởi ba chữ B rồi lại theo sau bởi hai chữ A, rồi lại theo sau bởi năm chữ B...Do đó có thể sử dụng phương pháp mã hoá độ dài loạt để mã hóa. Vì vậy
chuỗi kí tự trên được mã hoá lại như sau:
4A3BAA5B8CDABCB3A4B3CD. "4A" có nghĩa là "bốn chữ A"... Chú ý là không nên mã hoá các loạt chạy có độ dài 1 hoặc 2 vì cần đến hai kí tự để mã hoá. Ðối với các tập tin nhị phân ý tưởng ở đây là lưu lại các độ dài loạt bằng cách tận dụng sự kiện các loạt chạy có thay đổi giữa 0 và 1. Ví dụ dãy nhị phân 1010 được biểu diễn bởi cặp số đếm và ký tự thì là như sau 11101110 nhưng để tránh phải lưu chính các số 0 và 1 đó, một phiên bản được tinh chế của phương pháp này được dùng đã thu được sự tiết kiệm đáng kể, lúc này dãy nhị phân trên sẽ được biểu diễn là 1010 (tiết kiệm được 4 ký tự dùng làm số đêm). Có nghĩa là ta tiết kiệm
các bit trên một loạt chạy chỉ khi độ dài của đường chạy là lớn hơn số bit cần để biễu diễn
chính nó trong dạng nhị phân. Việc mã hoá độ dài loạt cần đến các biễu diễn riêng biệt cho tập tin và cho bản đã được mã hoá của nó, vì vậy nó không thể dùng cho mọi tập tin, ví dụ, phương pháp nén tập tin kí tự sẽ không dùng được đối với các chuỗi kí tự có chứa số. Nếu dùng những kí tự khác để mã hoá các số đếm, thì nó sẽ không làm việc với các chuỗi chứa các
CHƯƠNG 4: XỬ LÝ SỐ LIỆU TRUYỀN
46
kí tự đó. Ví dụ như ta phải mã hoá bất kì kí tự nào trong một bảng chữ cái cố định bằng cách chỉ dùng các kí tự từ bảng chữ cái đó.
Giả định rằng ta chỉ có 26 chữ cái trong bảng chữ cái (và cả khoảng trống) để làm việc. Ðể có thể dùng vài chữ cái để biểu diễn các số và các kí tự khác biểu diễn các phần tử của chuỗi sẽ được mã hoá, ta phải chọn một kí tự được gọi là kí tự "Escape". Mỗi một sự xuất hiện của kí tự đó báo hiệu rằng hai chữ cái tiếp theo sẽ tạo thành một cặp (số đếm, kí tự) với các số đếm được biểu diễn bằng cách dùng kí tự thứ i của bảng chữ cái để biểu diễn số i. Vì vậy, chuỗi ví dụ của chúng ta sẽ được biểu diễn như sau với Q được xem là các kí tự "Escape"
QDABBBAABQHCDABCBAAAQDBCCCD
(QDA có nghĩa là 4 chữ A…, QHC có nghĩa là 8 chữ C… )
Tổ hợp của kí tự "Escape", số đếm và một kí tự lặp lại được gọi là một dãy Escape. Chú ý
rằng không đáng để mã hoá các đường chạy có chiều dài ít hơn bốn kí tự, vì ít nhất là cần đến ba kí tự để mã hoá bất kì một loạt chạy nào.
Trong trường hợp bản thân kí tự "Escape" xuất hiện trong dãy kí tự cần mã hoá ta sử phải dụng một dãy "Escape" với số đếm là 0 (kí tự space) để biểu diễn kí tự cho "Escape".. ví dụ khi viết QEQCA (5 chữ Q, 1 chữ C 1 chữ A nhưng cũng có thể hiểu là 5 chữ Q, 3 chữ A), lúc này muốn biểu diễn 5 chữ Q, 1 chữ C 1 chữ A thì phải viết là Q0QQ0QQ0QQ0QQ0QCA ??? (trời đất!!!!!!) Như vậy trong trường hợp kí tự "Escape" xuất hiện nhiều thì có thể sẽ làm cho tập tin nén phình to hơn trước
Các loạt chạy dài có thể được cắt ra để mã hoá bằng nhiều dãy Escape, ví dụ, một loạt chạy gồm 51 chữ A sẽ được mã hoá như QZAQYA (z = 26, y = 25).
Phương pháp mã hoá độ dài loạt thường được áp dụng cho các tập tin đồ hoạ bitmap vì ở đó thường có các mảng lớn cùng màu được biểu diễn dưới dạng bitmap là các chuỗi bit có đường
chạy dài. Trên thực tế, nó được dùng trong các tập tin .PCX, .RLE.
4.3.5 Phương pháp mã hoá Huffman (dạng mã hóa thống kê)Mã tiền tố (Prefix-Free Binary Code) Mã tiền tố (Prefix-Free Binary Code)
Chúng ta vẫn mã hóa các kí hiệu bằng các xâu nhị phân với độ dài không đổi, được gọi là từ
mã của kí hiệu đó. Chẳng hạn bộ mã ASCII, mã hóa cho 256 kí hiệu là biểu diễn nhị phân của
các số từ 0 đến 255, mỗi từ mã gồm 8 bít. Khi mã hóa một tài liệu có thể không sử dụng đến
tất cả 256 kí hiệu, hơn nữa số lần xuất hiện của các ký tự là khác nhau. Do đóta có thể không
cần dùng hết 8 bít để mã hóa cho một ký hiệu, hơn nữa độ dài (số bit) dành cho mỗi kí hiệu có thể khác nhau, kí hiệu nào xuất hiện nhiều lần thì nên dùng ít bít để mã hóa, ký hiệu nào xuất
hiện ít thì dùng nhiều bít để mã hóa. Tuy nhiên, nếu mã hóa với độ dài thay đổi, khi giải mã
ta làm thế nào phân biệt được xâu bít nào là mã hóa của ký hiệu nào. Một trong các giải pháp là dùng các dấu phẩy (",") hoặc một kí hiệu quy ước nào đó để tách từ mã của các kí tự đứng cạnh nhau. Nhưng như thế số các dấu phẩy sẽ chiếm một không gian đáng kể trong bản mã. Một cách giải quyết khác dẫn đến khái niệm mã tiền tố. Mã tiền tố là bộ các từ mã của một tập hợp các kí hiệu sao cho từ mã của mỗi ký hiệu phải không là tiền tố (phần đầu) của từ mã
CHƯƠNG 4: XỬ LÝ SỐ LIỆU TRUYỀN
47
Ví dụ: Giả sử mã hóa từ "ARRAY", ký hiệu cần mã hóa là 3 chữ cái: "A", "R", "Y".
Nếu mã hóa bằng các từ mã có độ dài bằng nhau ta phải dùng ít nhất 2 bit cho một chữ cái chẳng hạn "A"=00, "R"=01, "Y"=10. Khi đó mã hóa của cả từ là 0001010010. Để giải mã ta đọc hai bit một và đối chiếu với bảng mã.
Nếu mã hóa "A"=0, "R"=01, "Y"=11 thì bộ từ mã này không là mã tiền tố vì từ mã của "A" là tiền tố của từ mã của "R". Lúc này để mã hóa cả từ ARRAY phải đặt dấu ngăn cách vào giữa các từ mã 0,01,01,0,11
Nếu mã hóa "A"=0, "R"=10, "Y"=11 thì bộ mã này là mã tiền tố. Với bộ mã tiền tố này khi mã hóa xâu "ARRAY" ta có 01010011.
Biểu diễn mã tiền tố trên cây nhị phân
Nếu có một cây nhị phân n lá ta có thể tạo một bộ mã tiền tố cho n ký hiệu bằng cách đặt mỗi ký hiệu vào một lá. Từ mã của mỗi kí hiệu được được tạo ra khi đi từ gốc tới lá chứa ký hiệu đó, nếu đi qua cạnh trái thì ta thêm số 0, đi qua cạnh phải thì thêm số 1.
Ví dụ: Cây 3 lá sau đây biểu diễn bộ mã của A,R,Y trong ví dụ trên
Mã Huffman:
Là cách xây dựng cây mã tiền tố tối ưu của Huffman (năm 1952) Các bước xây dựng bộ mã Huffman:
Dựng cây từ dưới lên, xuất phát với các nút lá
Các nút lá biểu diễn các ký tự và tần suất xuất hiện của ký tự trong văn bản
Các nút trong có 2 nhánh tương ứng với : 0 là nhánh bên trái và 1 là nhánh bên phải. Các nút này chứa tổng tần suất xuất hiện của các nút trong các nhánh con của nó
Một đường đi từ nút gốc đến nút lá chính là một mã nhị phân biểu diễn ký tự ở nút lá
Ký tự có tần suất lớn sẽ xuất hiện ở mức thấp hơn, ký tự có tần suất nhỏ sẽ xuất hiện ở mức cao hơn trong cây mã Huffman
Ví dụ: cho dãy ký tự cần truyền là: abcdef và tần xuất xuất hiện tương ứng cho trong bảng.
Hãy xây dựng bộ mã Huffman
Dãy ký tự cần mã hóa f e c b d a
CHƯƠNG 4: XỬ LÝ SỐ LIỆU TRUYỀN
48 Dưới đây là các bước xây dựng cây Huffman:
Bộ mã Huffman là: a = 0 b = 101
( duyệt từ gốc) c = 100 d = 111
CHƯƠNG 4: XỬ LÝ SỐ LIỆU TRUYỀN
49
Mã hóa bằng bộ mã Huffman
Các bước mã hóa:
Bước 1: Duyệt văn bản cần mã hóa và xác định tần suất xuất hiện của các ký tự
Bước 2: Sắp xếp các ký tự dựa trên tần suất xuất hiện của chúng trong vănbản
Bước 3: Xây dựng cây mã Huffman dựa trên dãy đã được sắp. Bước 4: Duyệt cây để xác định mã của các ký tự
Bước 5: Duyệt văn bản cần mã hóa và sinh văn bản mã hóa sử dụng mã có được ở bước 4
Ví dụ trên được mã hóa bằng cuỗi nhị phân sau: 010110011111011100
Giải mã Huffman
Xuất phát từ gốc của cây được mã hóa
Đọc lần lượt từng ký tự trong xâu mã hóa từ trái sang Nếu là 0 : đi sang trái
Nếu là 1: đi sang phải
Nếu chạm tới một nút lá ghi ký tự chứa tại nút lá ra, sau đó quay lại nút gốc của cây mã hóa. Ví dụ:
- Lần đọc đầu tiên: 0, sang trái, chạm nút lá a → ký tự a. Rồi quay lại gốc để duyệt tiếp - Lần đọc thứ hai: 1, sang phải, chưa gặp nút lá, 0 sang trái, chưa gặp nút lá, 1 sang phải, gặp nút lá b → ký tự b. Rồi quay lại gốc để duyệt tiếp
- Lần đọc thứ 3: 1, sang phải, chưa gặp nút lá, 0 sang trái, chưa gặp nút lá, 0 sang trái
gặp nút lá là c → ký tự c. Rồi quay lại gốc để duyệt tiếp - Quá trình sẽ dừng khi đã duyệt hết cây.
4.4 MẬT MÃ HÓA SỐ LIỆU
4.4.1 Khái quát
Đường truyền số liệu trong một số trường hợp cần phải được bảo mật, thí dụ như quốc phòng, ngân hàng .v.v..Như vậy ngoài các biện pháp xử lý số liệu cần thiết để truyền thành công và hiệu quả, số liệu còn được mật mã hóa bằng phương pháp nào đó, theo một khóa mã nào đó mà chỉ máy phát và máy thu mới biết được. Quá trình mật mã hóa và giải mã thường được thực hiện ở tầng liên kết số liệu (Data link).
Tuy nhiên cũng có những vi mạch cỡ lớn chuyên thực hiện mật mã hóa và giải mã số liệu. Các chip này cho phép người sử dụng thay đổi các giải thuật mật mã phức tạp với rất nhiều khóa khác nhau để lựa chọn.
Ngày nay mật mã hóa mức vật lý cũng được quan tâm nhiều, đặc biệt là mật mã hóa theo đường công nghệ, một số phương pháp lợi dụng công nghệ cao để tiến hành mật mã nó, thám
CHƯƠNG 4: XỬ LÝ SỐ LIỆU TRUYỀN
50
mã muốn biết bản gốc phải đạt được trình độ công nghệ tương đương mới có thể thực hiện được.
4.4.2 Mật mã hóa cổ điển
Bản gốc sẽ được mã hóa bằng một khóa được xác định trước để tạo ra một bản mã. Bản mã