CodeQuiz EP.26: Barcode อ่านยังไง?

https://storage.googleapis.com/code-leagues/Vetit_teacher_8c72ee627b/Vetit_teacher_8c72ee627b.png

พี่เว เวทิต

เผยแพร่เมื่อ

อัปเดตล่าสุดเมื่อ

CodeQuiz EP.26 - Barcode อ่านยังไง

สาระสำคัญ

  • Barcode คืออะไร?
  • วิธีการอ่าน Barcode แบบมาตรฐาน Barcode-128
  • Checksum คืออะไร และทำงานยังไง?
  • ตัวหยุด (Stop Character) ที่ทำให้สแกนกลับหัวได้

TL;DR

Barcode มาตรฐาน Barcode-128 อ่านโดยการนับความกว้างของแถบดำและขาวสลับกัน แล้วแบ่งกลุ่มทุกๆ 6 ตัวเลขเพื่อแปลงเป็นตัวอักษร โดยมี Checksum ไว้ตรวจสอบความถูกต้อง และมี Stop Character แบบพิเศษที่ทำให้สแกนกลับหัวได้!

CodeQuiz EP.26 - Barcode อ่านยังไง?


Barcode คืออะไร?

CodeQuiz EP.26 - Barcode อ่านยังไง 2.png

Barcode คือแถบสีดำสลับขาวที่สามารถอ่านด้วยเครื่องได้ เช่น Barcode ที่บัตรเลือกตั้ง จริง ๆ ก็มีตั้งหลายที่ แต่ตอนนี้บัตรเลือกตั้งมันมาแรงเหลือเกิน

เรามาลองดูวิธีการอ่านแถบนี้กัน

วิธีการอ่าน Barcode

CodeQuiz EP.26 - Barcode อ่านยังไง 3.png

Barcode จะมีแถบความกว้างที่ไม่เท่ากัน และมีสีขาวและดำ ใช้มาตรฐาน Barcode-128

ซึ่งเราจะอ่านตามความกว้าง ได้ว่า 211214111....

หลักการก็คือ เราจะนับความกว้างของแต่ละแถบ โดยเริ่มจากแถบแรกสุดทางซ้าย ไล่ไปทางขวา สลับกันระหว่างแถบดำและแถบขาว เช่น แถบดำกว้าง 2, แถบขาวกว้าง 1, แถบดำกว้าง 1 ก็จะอ่านได้ว่า 211 ไปเรื่อยๆ

แบ่งกลุ่มตัวเลข

CodeQuiz EP.26 - Barcode อ่านยังไง 4.png

จากนั้นนำมาแบ่งเป็นทุกๆ 6 เลข ซึ่งแต่ละอันก็จะมีความหมายของมันเอง

จาก Barcode ตัวอย่าง เราจะอ่านได้ว่า


- ตัวแรก — ให้ใช้ตัวอักษรเซ็ต B (Start Code B)

- ตัวที่ 3 — ให้ใช้ตัวอักษรเซ็ต C (Switch to Code C)

- ตัวที่ 2 - 10 (ไม่รวมสาม) — ข้อมูลจริงๆ คือ A40853843

- ตัวถัดมา — ตัวตรวจสอบความถูกต้อง (Checksum) คือ 7

- ตัวสุดท้าย — ให้หยุด (Stop Character)


ดังนั้น รหัสจึงเป็น A40853843


มาพูดถึง Checksum หรือตัวตรวจความถูกต้องสักหน่อย

CodeQuiz EP.26 - Barcode อ่านยังไง 5.png

Barcode จะมีตัวที่พยายามตรวจความถูกต้องของการอ่านเสมอ

โดยจะมีวิธีในการเช็คตามโค้ดด้านล่าง:

PYTHON
1
2
3
4
5
6
7
8
9
10
code = "A40853843" # code from barcode
total = 103 # Start Code A
checksum = 7 # checksum from barcode
for idx, character in enumerate(code, 1):
val = ord(character) - 32
total += idx * val
if total % 103 == checksum:
print("Pass")
else:
print("Fail")

หลักการก็คือ เราจะเริ่มจากค่า total เท่ากับ 103 (ค่าของ Start Code B) แล้วนำแต่ละตัวอักษรมาคำนวณโดยเอา ASCII ของตัวอักษรนั้นลบด้วย 32 แล้วคูณกับตำแหน่ง (เริ่มจาก 1) แล้วบวกเข้าไปใน total


สุดท้ายเอา total มา mod 103 ถ้าได้ค่าเท่ากับ checksum ที่อ่านได้จาก Barcode ก็แปลว่าอ่านถูกต้องนั่นเอง


อีกสิ่งที่น่าสนใจคือตัวหยุด

หยุด.... หยุดโดยไม่มีอะไรกั้น 🍊
CodeQuiz EP.26 - Barcode อ่านยังไง 6.png

ตัวหยุดมี 7 แถบที่จบด้วยแถบดำเสมอ ซึ่งช่วยให้ "สามารถสแกนกลับหัวได้!"

นั่นหมายความว่า ไม่ว่าเราจะหันบาร์โค้ดไปทางไหน เครื่องสแกนก็สามารถอ่านได้ถูกต้อง เพราะเครื่องจะดูจากตัวหยุดว่าอยู่ฝั่งไหน แล้วจึงตัดสินใจว่าจะอ่านจากซ้ายไปขวา หรือขวาไปซ้าย

สรุป

ดังนั้นเราจึงอ่าน Barcode ได้ไม่ยากนัก โดยสรุปขั้นตอนคือ

  1. อ่านความกว้างของแถบดำและขาวสลับกัน
  2. แบ่งกลุ่มทุกๆ 6 เลข แล้วแปลงเป็นตัวอักษรตามมาตรฐาน Barcode-128
  3. ตรวจสอบความถูกต้องด้วย Checksum
  4. ตัวหยุดช่วยให้สแกนได้ทั้งสองทิศทาง

ลองกลับไปอ่านบาร์โค้ดที่บ้านดูนะครับ :)