- QR 코드를 손으로 해독할 수 있도록 버전 1의 21×21 모듈 구조부터 마스크 해제와 바이트 변환까지 단계별 절차를 정리함
- 위치 찾기 패턴, 타이밍 패턴, 형식 정보, quiet zone 같은 특수 영역은 인식에는 필요하지만 실제 데이터 읽기에서는 건너뛰어야 함
- 데이터는 형식 정보에서 마스크 패턴과 오류 정정 수준을 확인한 뒤, 마스크의 검은 모듈 위치마다 QR 코드 모듈을 뒤집어 복원함
- 오른쪽 아래에서 시작해 두 열씩 지그재그 순서로 읽으며, Byte 모드에서는 길이 8비트 뒤의 8비트 묶음들이 문자 바이트가 됨
- 오류 정정 영역까지 손으로 풀 필요는 없으며, 단순 QR 코드는 길이 필드가 가리키는 만큼 바이트를 읽고 ASCII 표로 바꾸면 해독 가능함
손으로 읽을 QR 코드 준비
- 연습용 QR 코드는 세 가지 방식으로 준비할 수 있음
- 임의의 텍스트를 입력해 아래에서 설명할 QR 코드를 갱신
- 카메라로 기존 QR 코드를 스캔해 읽는 법을 학습
- 무작위 영어 단어로 연습하되, 단어는 표시되지 않아 훈련용으로 사용 가능
- 예시 QR 코드는 21×21 모듈 크기임
- QR 코드에서 픽셀에 해당하는 단위는 모듈(module) 이라 부름
- QR 코드 크기는 버전(version) 으로 구분됨
- 가장 작은 버전은 21×21 모듈
- 이후 버전마다 한 변의 크기가 4씩 증가
- 21×21 모듈 QR 코드는 버전 1임
QR 코드에서 건너뛸 특수 영역
- 위치 찾기 패턴(finder pattern) 은 스캐너가 QR 코드를 먼저 식별하는 데 도움을 줌
- 위치 찾기 패턴 주변의 빈 줄은 내용을 읽을 때 건너뛰어야 함
- 버전 1 QR 코드에는 정렬 패턴(alignment pattern) 이 없음
- 정렬 패턴은 스캐너가 QR 코드를 올바르게 읽도록 돕는 추가 패턴임
- 타이밍 패턴(timing pattern) 은 흑백 모듈이 항상 번갈아 나타나는 두 줄로, 스캐너가 QR 코드를 올바르게 읽는 데 도움을 줌
- 형식 정보는 마스크 패턴과 오류 정정 수준을 결정함
- 세로 형식 정보와 가로 형식 정보가 있음
- 타이밍 패턴은 두 줄을 모두 끊고 지나감
- quiet zone은 QR 코드 주변의 흰색 테두리임
- 스캐너가 QR 코드의 시작과 끝을 식별하는 데 도움을 줌
마스크 패턴 해제
- QR 코드는 큰 검은 덩어리나 흰 덩어리를 피하기 위해 마스크(mask) 를 사용함
- 마스크에는 총 8가지 선택지가 있음
- 예시에서는 검은 모듈을 1, 흰 모듈을 0으로 읽어 마스크 패턴 비트를 확인함
- 예시 비트는 이진수
110 110은 십진수 6에 해당함
- 예시 비트는 이진수
- 각 마스크 유형에는 미리 정의된 패턴이 있음
- 예시 QR 코드의 패턴은 흑백 무지개의 일부처럼 보이는 패턴임
- 마스크를 데이터 영역 위에 반복해서 놓은 뒤, 마스크에서 검은 모듈인 위치마다 QR 코드 모듈을 뒤집음
- 모든 마스크 유형의 치트시트를 담은 DIY zine이 제공됨
- 작은 책자로 접는 예시는 이 안내 이미지를 참고할 수 있음
인코딩 모드와 읽기 순서
- 내용 해독은 먼저 인코딩 모드를 확인하는 데서 시작함
- 인코딩 정보는 항상 오른쪽 아래 구석에 있음
- 인코딩 모드도 먼저 마스크를 적용해 해제해야 함
- 예시에서는 치트시트를 보고 두 박스를 XOR함
- 인코딩 모드에는 Numeric, Alphanumeric, Byte, ECI, Kanji 등이 있음
- 예시 QR 코드의 인코딩 모드는 Byte(4) 임
- 내용은 오른쪽 아래 구석에서 시작함
- 두 열 사이를 지그재그로 오르며 읽음
- 그다음 왼쪽의 다음 두 열에서 지그재그로 내려감
- 모든 특수 영역은 항상 건너뜀
길이와 바이트 해독
- 첫 4비트는 인코딩 모드임
- Byte 모드에서는 다음 8비트가 내용 길이를 지정함
- 이후에는 8비트마다 하나의 내용 바이트가 됨
- 길이 정보도 마스크를 적용해 해제해야 함
- 예시의 마스크 해제된 길이 정보는
00001100임- 십진수로
12 - 전체 내용 길이가 12바이트라는 뜻임
- 십진수로
- 첫 번째 마스크 해제 바이트는
01001000임- 16진수로
0x48 - 대응하는 ASCII 문자는
H
- 16진수로
- 두 번째 마스크 해제 바이트는
01100101임- 16진수로
0x65 - 대응하는 ASCII 문자는
e
- 16진수로
- 나머지 바이트는 연습용으로 남겨져 있으며, 앞서 읽은 길이 필드가 가리키는 문자 수만큼 읽으면 멈출 수 있음
ASCII 표와 오류 정정
- ASCII 표를 사용해 16진수 값을 문자로 변환할 수 있음
- 소문자는
a가0x61에서 시작하고z가0x7A에서 끝남- 중간 문자는 세어서 찾을 수 있음
- 모든 남은 영역이 내용은 아님
- QR 코드에는 오류 정정(error correction) 도 포함됨
- 일부가 손상되거나 흐리거나 빠져도 QR 코드를 읽을 수 있게 함
- 오류 정정은 수학으로 생성되지만, 손으로 읽는 목적에서는 다루지 않음
- 단순 QR 코드를 손으로 해독하는 절차를 익힌 뒤에는 무작위 코드 버튼으로 짧은 영어 단어를 연습하거나, Scan code 버튼으로 실제 QR 코드를 스캔할 수 있음
- 소스 코드는 Codeberg에 있음
- UTF-8 인코딩 모드를 설명하는 PR을 특히 환영함