Tự tạo qrcode cho cá nhân.
Qrcode
Hôm nay mình sẽ giới thiệu về 1 loại barcode mà rất hay bắt gặp
Về cơ bản qrcode là bản nâng cấp của barcode. Việc lưu trữ được nhiều thông tin và đa dạng về kiểu dữ liệu là những gì qrcode hơn barcode. Nguyên nhân là do khả năng lưu trữ theo 2 hướng nên còn được gọi là two-direction barcode
Có 40 version từ 1-40. Version 1 có 21x21 module và cứ mỗi version sau hơn version trước 4 module về mỗi chiều.
Mã bao gồm các module đen được sắp xếp trên mô hình vuông trên nền trắng. Module đen là bit 1, module trắng là bit 0.
1 khái niệm quan trọng trong qrcode đó là mức sữa lỗi(error correction level). Ứng với mỗi version đều có 4 mức sữa lỗi là L 7%, M 15%, Q 25%, H 30%. Đây là mức sữa lỗi(khôi phục) phần thông tin mã hóa khi bị mất mát hay không thể đọc được. Ví dụ như cái qrcode trên đầu kia mất đi 1 góc thì nhờ vào sữa lỗi. vẫn có thể đọc được dữ liệu như bình thường.
HAY “tạo riêng cho mình 1 qrcode in lên thủy tinh làm móc chìa khóa hay vật lưu niệm” cũng là ý tưởng rất độc đáo // xD xD
B2: Encode dữ liệu(data encoding)
B3: Tạo phần sữa lỗi(error correction)
B4: Cấu trúc dữ liệu đưa vào qrcode(structure final message)
B5: Tạo các module của qrcode với cấu trúc dữ liệu vừa tạo ra(module placement in matrix)
B6: Xác định Data Masking(data masking)
B7: Định dạng và xác định thông tin version(format and version information)
Các kiểu dữ liệu
Mức độ lưu trữ dữ liệu đối với các version http://www.thonky.com/qr-code-tutori...ter-capacities
Với mỗi kiểu dữ liệu sẽ có cách encode riêng. Nhưng mục đích cuối cùng đều sẽ chuyến sang dạng bit
4 bit đầu tiên sẽ lưu trữ thông tin kiểu dữ liệu
Chuyển độ dài dữ liệu sang dạng bit
vu vo là 5 ký tự. -> 101 ->(thêm các bit 0 trước chuỗi để đủ 9 bit) 0 0000 0101
Các ký tự lần lượt encode với độ dài 8 bit.
V: 0111 0110
U: 0111 0101
“ ”: 0010 0000
V: 0111 0110
O: 0110 1111
01110110 01110101 00100000 00100000 01110110 01101111
0100 000000101 01110110 01110101 00100000 00100000 01110110 01101111
Hiện tại là 4 + 9 + 5*8 = 53 bit. Với version 1 ta cần đoạn bit này là 19*8=152 bit(xem thêm các version khác ở đây www.thonky.com/qr-code-tutorial/error-correction-table)
khi đang còn thiếu ta sẽ chia đoạn bit này thành các byte. 53/8 = 6 dư 5 -> không đủ 104 bit, ta phải thêm 4 bit 0 vào cuối -> 7 byte dư 1 bit. thêm 7 số 0 để đủ byte cuối. -> đã có 8 byte. Thêm tiếp lần lượt 2 byte 11101100 và 00010001 cho tới khi đủ 13 byte(104 bit)
0100_0000 0010_1011 1011_0011 1010_1001 0000_0001 0000_0011 1011_0011 0111_1000 0000_0000
11101100 0001000111101100 0001000111101100 0001000111101100 000100011110110000010001
Chuyển sang integer: 64 43 179 169 1 3 179 120 0 236 17 236 17 236 17 236 17 236 17
Tạo phần sữa lỗi. ở cột EC codeword per block. 1L là 7 do đó số byte sữa lỗi là 7 * 1 = 7 (1 block)
Với các số từ 0-255 thực hiện phép tóan. Lấy 2[SUP]0 [/SUP]% 285 = 1(phép toán module chia lấy dư), tiếp tục thực hiện với 2[SUP]1[/SUP] sẽ là 2[SUP]0[/SUP]*2 -> 1*2=2, 2[SUP]2[/SUP] sẽ là 2[SUP]1[/SUP]*2 -> 2*2=4, tương tự với 2[SUP]3[/SUP], …, 2[SUP]254[/SUP], 2[SUP]255[/SUP]. Nhưng khi kết quả lớn hơn 255, kết quả sẽ xor với 285. Như 2[SUP]8[/SUP]=2[SUP]7[/SUP]*2=256 -> 256 % 285 = 29. Với những số có số mũ lớn hơn 255. 2[SUP]300[/SUP] -> 2[SUP]300%256[/SUP]=2[SUP]44[/SUP]. Số được tạo ra được gọi là alpha (2[SUP]0[/SUP]*2 -> alpha, alpha=2, 0 được gọi là integer). Tham khảo thêm các số còn lại và cách chuyển từ integer sang alpha tại www.thonky.com/qr-code-tutorial/log-antilog-table
Ta bắt đầu khởi tạo phần sữa lỗi. Lưu ý: ở đây không phân biệt số âm với số dương nên “ -N=N ”
Bắt đầu với 2 phần sữa lỗi (x-α[SUP]0[/SUP]) (x- α[SUP]1[/SUP]) -> (x+ α[SUP]0[/SUP]) (x+ α[SUP]1[/SUP]) -> α[SUP]0[/SUP]x[SUP]2[/SUP] + (α[SUP]0[/SUP] + α[SUP]1[/SUP])x + α[SUP]0[/SUP] α[SUP]1[/SUP] x[SUP]0[/SUP]
->(cần xem bảng) 1x[SUP]2[/SUP] + (1 + 2)x + 1*2 x[SUP]0 [/SUP]->(vẫn cần xem bảng ) ) 1x[SUP]2[/SUP] + 3x + 2x[SUP]0 [/SUP]->(tiếp tục xem bảng) -> α[SUP]0[/SUP]x[SUP]2[/SUP] + α[SUP]25[/SUP]x + α[SUP]1[/SUP] x[SUP]0[/SUP]
Tiếp tục với 3 phần sữa lỗi. (α[SUP]0[/SUP]x[SUP]2[/SUP] + α[SUP]25[/SUP]x + α[SUP]1[/SUP] x[SUP]0[/SUP]) (x- α[SUP]2[/SUP]) -> (α[SUP]0[/SUP]x[SUP]2[/SUP] + α[SUP]25[/SUP]x + α[SUP]1[/SUP] x[SUP]0[/SUP]) (x + α[SUP]2[/SUP]) ->
x[SUP]3[/SUP] + (α[SUP]25[/SUP] + α[SUP]2[/SUP])x[SUP]2[/SUP] + (α[SUP]27[/SUP] + α[SUP]1[/SUP])x[SUP]1[/SUP] + α[SUP]3 [/SUP]-> x[SUP]3[/SUP] + (4 + 3)x[SUP]2[/SUP] + (12 + 2)x[SUP]1[/SUP] + α[SUP]3 [/SUP]->
x[SUP]3[/SUP] + α[SUP]198[/SUP]x[SUP]2[/SUP] + α[SUP]199[/SUP]x[SUP]1[/SUP] + α[SUP]3 [/SUP]
Làm như vậy cho đến mức sữa lỗi 255. Chú ý, nếu nhân ra số mũ lớn hơn 255 thì thực hiện module cho 255.
Thứ tự các byte sẽ được sắp xếp là
67 246 182 70 85 246 230 247 70 66 247 118 … 38 6 50 17 7 236
Tương tự với các byte error code,
Thứ tự sẽ được sắp xếp là:
213 87 148 235 199 204 116 159 … 390 133 141 236
Nối 2 chuỗi byte là ta đã có được structure final message.
Sau đó chỉ cần chuyển sang dạng bit.
Chú ý: vì các version sẽ có số lượng các bits cần điền vào không là bội của 8(vì số module cần điền là: số hàng * số cột – số module parrnent) do đó phải thêm các bits 0 vào sau chuỗi nhị phân nếu cần
Lưu ý: Những module đã được tạo khi tạo các parttern thì bỏ qua.
0->1 hoặc 1->0
Thêm vào vùng version information(có 2 vùng).
1 điểm quan trọng. lần lượt thêm vào qrcode theo hướng xác định
Ok mình hướng dẫn đến đây là các bạn đã có thể tự tạo ra qrcode mã hóa thông tin các nhân rồi. )
Sắp đến tết rồi. về nhà ăn tết thôi
Hôm nay mình sẽ giới thiệu về 1 loại barcode mà rất hay bắt gặp
Về cơ bản qrcode là bản nâng cấp của barcode. Việc lưu trữ được nhiều thông tin và đa dạng về kiểu dữ liệu là những gì qrcode hơn barcode. Nguyên nhân là do khả năng lưu trữ theo 2 hướng nên còn được gọi là two-direction barcode
- Thông tin cơ bản và lịch sử hình thành của qrcode.
Có 40 version từ 1-40. Version 1 có 21x21 module và cứ mỗi version sau hơn version trước 4 module về mỗi chiều.
Mã bao gồm các module đen được sắp xếp trên mô hình vuông trên nền trắng. Module đen là bit 1, module trắng là bit 0.
1 khái niệm quan trọng trong qrcode đó là mức sữa lỗi(error correction level). Ứng với mỗi version đều có 4 mức sữa lỗi là L 7%, M 15%, Q 25%, H 30%. Đây là mức sữa lỗi(khôi phục) phần thông tin mã hóa khi bị mất mát hay không thể đọc được. Ví dụ như cái qrcode trên đầu kia mất đi 1 góc thì nhờ vào sữa lỗi. vẫn có thể đọc được dữ liệu như bình thường.
- Ứng dụng thực tế cho qrcode.
HAY “tạo riêng cho mình 1 qrcode in lên thủy tinh làm móc chìa khóa hay vật lưu niệm” cũng là ý tưởng rất độc đáo // xD xD
- Để thực hiện có qrcode của riêng mình cần thực hiện theo các bước:
B2: Encode dữ liệu(data encoding)
B3: Tạo phần sữa lỗi(error correction)
B4: Cấu trúc dữ liệu đưa vào qrcode(structure final message)
B5: Tạo các module của qrcode với cấu trúc dữ liệu vừa tạo ra(module placement in matrix)
B6: Xác định Data Masking(data masking)
B7: Định dạng và xác định thông tin version(format and version information)
- Nghiên cứu dữ liệu
Các kiểu dữ liệu
Numberic | Dữ liệu chứa toàn bộ là số 0 – 9 |
Alphanumberic | Dữ liệu chứa cả số và chữ in hoa(không có chữ in thường) |
Byte | Dữ liệu chứa cả in hoa, in thường, số, các ký tự có ascii từ 128-155(ascii 22-255) |
Kanji | Chữ tượng hình của Nhật Bản |
- Encode dữ liệu
Với mỗi kiểu dữ liệu sẽ có cách encode riêng. Nhưng mục đích cuối cùng đều sẽ chuyến sang dạng bit
4 bit đầu tiên sẽ lưu trữ thông tin kiểu dữ liệu
Numberic | 0001 |
Alphanumberic | 0010 |
Byte | 0100 |
Kanji | 1000 |
Chuyển độ dài dữ liệu sang dạng bit
- Ứng với mỗi version thì số lượng bit phục vụ cho việc lưu trữ độ dài dữ liệu là khác nhau
Ver 1 – 9 | Ver 10 – 26 | Ver27 – 40 | |
Numberic | 10 | 12 | 14 |
AlphaNumberic | 9 | 11 | 13 |
Byte | 8 | 16 | 16 |
Kanji | 8 | 10 | 12 |
Các ký tự lần lượt encode với độ dài 8 bit.
V: 0111 0110
U: 0111 0101
“ ”: 0010 0000
V: 0111 0110
O: 0110 1111
01110110 01110101 00100000 00100000 01110110 01101111
- Tạo phần sữa lỗi
0100 000000101 01110110 01110101 00100000 00100000 01110110 01101111
Hiện tại là 4 + 9 + 5*8 = 53 bit. Với version 1 ta cần đoạn bit này là 19*8=152 bit(xem thêm các version khác ở đây www.thonky.com/qr-code-tutorial/error-correction-table)
khi đang còn thiếu ta sẽ chia đoạn bit này thành các byte. 53/8 = 6 dư 5 -> không đủ 104 bit, ta phải thêm 4 bit 0 vào cuối -> 7 byte dư 1 bit. thêm 7 số 0 để đủ byte cuối. -> đã có 8 byte. Thêm tiếp lần lượt 2 byte 11101100 và 00010001 cho tới khi đủ 13 byte(104 bit)
0100_0000 0010_1011 1011_0011 1010_1001 0000_0001 0000_0011 1011_0011 0111_1000 0000_0000
11101100 0001000111101100 0001000111101100 0001000111101100 000100011110110000010001
Chuyển sang integer: 64 43 179 169 1 3 179 120 0 236 17 236 17 236 17 236 17 236 17
Tạo phần sữa lỗi. ở cột EC codeword per block. 1L là 7 do đó số byte sữa lỗi là 7 * 1 = 7 (1 block)
Với các số từ 0-255 thực hiện phép tóan. Lấy 2[SUP]0 [/SUP]% 285 = 1(phép toán module chia lấy dư), tiếp tục thực hiện với 2[SUP]1[/SUP] sẽ là 2[SUP]0[/SUP]*2 -> 1*2=2, 2[SUP]2[/SUP] sẽ là 2[SUP]1[/SUP]*2 -> 2*2=4, tương tự với 2[SUP]3[/SUP], …, 2[SUP]254[/SUP], 2[SUP]255[/SUP]. Nhưng khi kết quả lớn hơn 255, kết quả sẽ xor với 285. Như 2[SUP]8[/SUP]=2[SUP]7[/SUP]*2=256 -> 256 % 285 = 29. Với những số có số mũ lớn hơn 255. 2[SUP]300[/SUP] -> 2[SUP]300%256[/SUP]=2[SUP]44[/SUP]. Số được tạo ra được gọi là alpha (2[SUP]0[/SUP]*2 -> alpha, alpha=2, 0 được gọi là integer). Tham khảo thêm các số còn lại và cách chuyển từ integer sang alpha tại www.thonky.com/qr-code-tutorial/log-antilog-table
Ta bắt đầu khởi tạo phần sữa lỗi. Lưu ý: ở đây không phân biệt số âm với số dương nên “ -N=N ”
Bắt đầu với 2 phần sữa lỗi (x-α[SUP]0[/SUP]) (x- α[SUP]1[/SUP]) -> (x+ α[SUP]0[/SUP]) (x+ α[SUP]1[/SUP]) -> α[SUP]0[/SUP]x[SUP]2[/SUP] + (α[SUP]0[/SUP] + α[SUP]1[/SUP])x + α[SUP]0[/SUP] α[SUP]1[/SUP] x[SUP]0[/SUP]
->(cần xem bảng) 1x[SUP]2[/SUP] + (1 + 2)x + 1*2 x[SUP]0 [/SUP]->(vẫn cần xem bảng ) ) 1x[SUP]2[/SUP] + 3x + 2x[SUP]0 [/SUP]->(tiếp tục xem bảng) -> α[SUP]0[/SUP]x[SUP]2[/SUP] + α[SUP]25[/SUP]x + α[SUP]1[/SUP] x[SUP]0[/SUP]
Tiếp tục với 3 phần sữa lỗi. (α[SUP]0[/SUP]x[SUP]2[/SUP] + α[SUP]25[/SUP]x + α[SUP]1[/SUP] x[SUP]0[/SUP]) (x- α[SUP]2[/SUP]) -> (α[SUP]0[/SUP]x[SUP]2[/SUP] + α[SUP]25[/SUP]x + α[SUP]1[/SUP] x[SUP]0[/SUP]) (x + α[SUP]2[/SUP]) ->
x[SUP]3[/SUP] + (α[SUP]25[/SUP] + α[SUP]2[/SUP])x[SUP]2[/SUP] + (α[SUP]27[/SUP] + α[SUP]1[/SUP])x[SUP]1[/SUP] + α[SUP]3 [/SUP]-> x[SUP]3[/SUP] + (4 + 3)x[SUP]2[/SUP] + (12 + 2)x[SUP]1[/SUP] + α[SUP]3 [/SUP]->
x[SUP]3[/SUP] + α[SUP]198[/SUP]x[SUP]2[/SUP] + α[SUP]199[/SUP]x[SUP]1[/SUP] + α[SUP]3 [/SUP]
Làm như vậy cho đến mức sữa lỗi 255. Chú ý, nếu nhân ra số mũ lớn hơn 255 thì thực hiện module cho 255.
- Cấu trúc dữ liệu đưa vào qrcode
Kiểu dữ liệu | Độ dài dữ liệu | Data encode | Error correct |
- Khi tạo qrcode dữ liệu sẽ được tọa bằng: cách lấy các byte của các block sắp xếp lại với nhau.
Col 1 | Col 2 | Col 3 | Col 4 | Col 5 | Col 6 | Col 7 | Col 8 | Col 9 | Col 10 | Col 11 | Col 12 | Col 13 | Col 14 | Col 15 | Col 16 | |
Block 1 | 67 | 85 | 70 | 134 | 87 | 38 | 85 | 194 | 119 | 50 | 6 | 18 | 6 | 103 | 38 | |
Block 2 | 246 | 246 | 66 | 7 | 118 | 134 | 242 | 7 | 38 | 86 | 22 | 198 | 199 | 146 | 6 | |
Block 3 | 182 | 230 | 247 | 119 | 50 | 7 | 118 | 134 | 87 | 38 | 82 | 6 | 134 | 151 | 50 | 7 |
Block 4 | 70 | 247 | 118 | 86 | 194 | 6 | 151 | 50 | 16 | 236 | 17 | 236 | 17 | 236 | 17 | 236 |
67 246 182 70 85 246 230 247 70 66 247 118 … 38 6 50 17 7 236
Tương tự với các byte error code,
Col 1 | Col 2 | Col 3 | Col 4 | Col 5 | Col 6 | Col 7 | Col 8 | Col 9 | Col 10 | Col 11 | Col 12 | Col 13 | Col 14 | Col 15 | Col 16 | Col 17 | Col 18 | |
Block 1 | 213 | 199 | 11 | 45 | 115 | 247 | 241 | 223 | 229 | 248 | 154 | 117 | 154 | 111 | 86 | 161 | 111 | 39 |
Block 2 | 87 | 204 | 96 | 60 | 202 | 182 | 124 | 157 | 200 | 134 | 27 | 129 | 209 | 17 | 163 | 163 | 120 | 133 |
Block 3 | 148 | 116 | 177 | 212 | 76 | 133 | 75 | 242 | 238 | 76 | 195 | 230 | 189 | 10 | 108 | 240 | 192 | 141 |
Block 4 | 235 | 159 | 5 | 173 | 24 | 147 | 59 | 33 | 106 | 40 | 255 | 172 | 82 | 2 | 131 | 32 | 178 | 236 |
213 87 148 235 199 204 116 159 … 390 133 141 236
Nối 2 chuỗi byte là ta đã có được structure final message.
Sau đó chỉ cần chuyển sang dạng bit.
Chú ý: vì các version sẽ có số lượng các bits cần điền vào không là bội của 8(vì số module cần điền là: số hàng * số cột – số module parrnent) do đó phải thêm các bits 0 vào sau chuỗi nhị phân nếu cần
- Tạo các module của qrocde với cấu trúc dữ liệu vừa tạo ra
- Tạo parttern
-
- Thêm vào phần dữ liệu
Lưu ý: Những module đã được tạo khi tạo các parttern thì bỏ qua.
- Xác định Data Masking
0->1 hoặc 1->0
Mask Number | If the formula below is true for a given row/column coordinate, switch the bit at that coordinate |
(row + column) mod 2 == 0 | |
(row) mod 2 == 0 | |
(column) mod 3 == 0 | |
(row + column) mod 3 == 0 | |
( floor(row / 2) + floor(column / 3) ) mod 2 == 0 | |
((row * column) mod 2) + ((row * column) mod 3) == 0 | |
( ((row * column) mod 2) + ((row * column) mod 3) ) mod 2 == 0 | |
( ((row + column) mod 2) + ((row * column) mod 3) ) mod 2 == 0 |
- Định dạng và xác định thông tin version
Thêm vào vùng version information(có 2 vùng).
1 điểm quan trọng. lần lượt thêm vào qrcode theo hướng xác định
Ok mình hướng dẫn đến đây là các bạn đã có thể tự tạo ra qrcode mã hóa thông tin các nhân rồi. )
Sắp đến tết rồi. về nhà ăn tết thôi
Chỉnh sửa lần cuối bởi người điều hành: