5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

車検証の分割QRコード(連結QRコード)を読み取る

Last updated at Posted at 2023-12-12

そもそもQRコードとは

QRコードは株式会社デンソーウェーブの登録商標です

Quick Response --- 素早く読み取る・反応する という意味のようです。

1994年に株式会社デンソーウェーブにより開発された。2006年には国際規格に制定され、QRコードの仕様がオープン化されています。

「QRコード」という文言は商標登録

※結構重要なのですが「QRコード」という文言を使用する場合は登録商標文記載が必要です。↑記載してます。

一般名称は 「2次元バーコード」 とのこと。
2次元バーコードは、QRコード以外にAztec,Code49,DataMatrix,MicroPDF417,PDF471など

誤り訂正機能

QRコードが汚れてたり一部認識できなかったりしても認識できるような仕様で、誤り訂正機能といいます。誤り訂正の割合が高ければ高いほど、1つのQRコード内に収めるデータ量が少なくなりますが、過酷な環境下であってもQRコードが利用できるとおもえば素晴らしい機能ですね。

車検証で使われているQRコードについてはMまたはQとの記載があり、およそ15%〜25%の誤り訂正機能があります。

分割QRコードについて

「分割QRコード」や「連結QRコード」という文言で記載されているようです。1つのQRコードに入り切らないデータ量の場合、分割することができます。分割したQRコードを連結して1つの文字列にして利用します。

image.png

  • QRコードのヘッダーの0バイト目左4bitが「3」であれば分割QRコード
  • バイナリデータを取得してヘッダ(最初の部分)を取得する必要がある
  • Nが分割QRコード内の位置(0開始の連番)
  • Tは分割QRコードの総数(4bitのため分割QRコードは最大16までとなる)
  • パリティ1+パリティ2はQRコードのIDとなるため、パリティ1+パリティ2が同一となる分割QRコードを取得して連結する必要がある。(最大256)

基本的な分割QRコードの読み取り手順としては、以下です。
 1. QRコードのヘッダ部分を読み込む
 1. 最初の4Bitを取得し3かどうかを判定する
 1. パリティ1+パリティ2、分割数を読み込んで同一かどうか判定する
 1. 同一であることがわかればデータを貯めておき、結合する

Androidで分割QRコードリーダー実装

Androidでは、QRコード実装といえば、MLKitが有名です。通常のQRコードを読み込むにはMLKitで十分ですが、ヘッダー情報を読み取ることができません。
そこでAndroid以外でも有名なQRコードライブラリでもあるZXing(zebra crossing)ライブラリを利用します。
https://github.com/zxing/zxing

QRコードをバイト配列として取得し、最初の1バイトを取得します。
1バイトを16進数に変換すると2つの配列になるので、1つ目に3が入っていれば分割QRコードであることがわかります。

xzing.kt
rawQrcode = result.getRawBytes(); // ByteArray
startByte = rawQrcode[0]; // 最初の1Byte 
hexDec = startByte.toString(radix:16); // 16進数に変換する。1Byteなので16進数2つ(配列)で取得
hexDec[0] // 最初の 4bit
hexDec[1] // 次の4bit

iOSで分割QRコードリーダー実装

iOSでは、Vision.frameworkを利用します。AndroidのMLKitと似ています。Vision.frameworkではヘッダー情報が取得できます。errorCorrectedPayloadにて取得できます。

  • errorCorrectedPayloadでbyte codeを取得
  • payloadStringValueは、ヘッダーは取得できない。中身のデータを取得する
qr.swift
       var qrcodeInfo = QRCodeInfo()

        let dataByteArray: [Byte] = [Byte](qrcodeData)
        if dataByteArray.count >= 2 {
            let dataByte1 = dataByteArray[0].toHexString()
            let splitCode = dataByte1.first // ここが最初の4bit
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?