Tự tạo qrcode cho cá nhân.

nonellldd

VIP Members
25/04/2015
18
19 bài viết
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
1489939947overview.png



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.
Năm 1994, công ty Denso Wave(công ty con của Toyota) đã phát minh ra qrcode nhằm mục đích theo dõi quá trình sản xuất xe. Qr là viết tắt của quick response.
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.
Hiện nay qrcode ứng dụng khá nhiều. Chúng ta có thể bắt gặp những ô vuông đen trắng trên các sản phẩm ở siêu thị, trong các vCard, trên các trang báo(dùng smartphone quét url để truy cập bản online), …

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
:cool::cool:
  • Để thực hiện có qrcode của riêng mình cần thực hiện theo các bước:
B1: Nghiên cứu dữ liệu(data analysis)
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)
  1. Nghiên cứu dữ liệu
Đây là bước xác định kiểu dữ liệu trước khi encode. Khả năng lưu trữ dữ liệu với mỗi version và mức sữa lỗi đối với mỗi kiểu dữ liệu là khác nhau do đó bước này là để lựa chọn version và mức sữa lỗi phù hợp.
Các kiểu dữ liệu
NumbericDữ liệu chứa toàn bộ là số 0 – 9
AlphanumbericDữ liệu chứa cả số và chữ in hoa(không có chữ in thường)
ByteDữ liệu chứa cả in hoa, in thường, số, các ký tự có ascii từ 128-155(ascii 22-255)
KanjiChữ tượng hình của Nhật Bản
Mức độ lưu trữ dữ liệu đối với các version http://www.thonky.com/qr-code-tutori...ter-capacities
  1. Encode dữ liệu
Thực hiện encode dữ liệu. Ví dụ mình cần encode 1 đoạn dữ liệu là: “vu vo” (Vu vơ). Mình sẽ chọn kiểu dữ liệu byte và mức sữa lỗi L
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
Numberic0001
Alphanumberic0010
Byte0100
Kanji1000






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 – 9Ver 10 – 26Ver27 – 40
Numberic 10 12 14
AlphaNumberic 9 11 13
Byte 8 16 16
Kanji 8 10 12
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
  1. Tạo phần sữa lỗi
ghép với kiểu dữ liệu, độ dài dữ liệu
0100 000000101 01110110 01110101 00100000 00100000 01110110 01101111
1489939947error-collection-block.PNG



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 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.
  1. Cấu trúc dữ liệu đưa vào qrcode
Cấu trúc dữ liệu cần đưa vào qrcode
Kiểu dữ liệu Độ dài dữ liệu Data encode Error correct
  1. 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.
Vd: 5-Q có 2 block trong group1 và 2 block trong group2()


Col 1Col 2Col 3Col 4Col 5Col 6Col 7Col 8Col 9Col 10Col 11Col 12Col 13Col 14Col 15Col 16
Block 167857013487388519411950618610338
Block 224624666711813424273886221981991466
Block 31822302471195071181348738826134151507
Block 4702471188619461515016236172361723617236
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,
Col 1Col 2Col 3Col 4Col 5Col 6Col 7Col 8Col 9Col 10Col 11Col 12Col 13Col 14Col 15Col 16Col 17Col 18
Block 121319911451152472412232292481541171541118616111139
Block 28720496602021821241572001342712920917163163120133
Block 314811617721276133752422387619523018910108240192141
Block 423515951732414759331064025517282213132178236
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
  1. 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
    • 1489939947tao-parttern.png
    • Thêm vào phần dữ liệu
1489939947them-du-lieu.png





Lưu ý: Những module đã được tạo khi tạo các parttern thì bỏ qua.
  1. Xác định Data Masking
Có 8 các kiểu data masking, lựa chọn mask, sau đó những ô thỏa mãn điều kiện sẽ thay đỗi bit từ
0->1 hoặc 1->0
Mask NumberIf 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
  1. Định dạng và xác định thông tin version
Sau khi đã thực hiện thêm parttern ta cần thêm chuỗi bit xác định version và kiểu sữa lỗi
1489939947partern.png



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
1489939947read_way.png




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 :cool::cool::cool::cool::cool:
 
Chỉnh sửa lần cuối bởi người điều hành:
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Bên trên