【Swift】 QR 코드의 분할 정보를 취득한다

6782 단어 iOSSwift
iOS 앱에서 QR 코드를 로드하려고 하면 QR 코드가 분할되었을 수 있음을 알았습니다.

약 수첩이나 자동차 검증 등에도 사용되고있는 것 같습니다.

iOS 앱에서 그 분할 정보를 취득하는 "이것이다!"라는 방법을 찾을 수 없었기 때문에 정리해 둡니다.

「아니 아니, 더 좋은 방법이 있어」라고 하는 분은 코멘트 받을 수 있으면 도움이 됩니다. . .

분할 QR 코드 정보




QR코드가 뭐라고 하는 것은 할애합니다.
구구주세요.

이번에 전하고 싶은 것은 QR 코드가 분할될 수 있다는 것입니다.
위와 같은 2개의 약 수첩용 QR코드는 2개 갖추어져 필요한 정보를 취득할 수 있습니다.

1개의 QR코드가 보관할 수 있는 정보량은 정해져 있기 때문에,
상한을 넘는 정보량을 출력하기 위해 QR 코드는 분할할 수 있다는 이야기입니다.

분할 정보는 어디에 있습니까?



QR 코드를 바이너리로 하면 알 수 있습니다.


바이너리 정보
설명


첫 번째 바이트의 처음 4비트
3이라면 분할 QR 코드

첫 번째 바이트 뒤 4비트
분할된 QR 코드 위치(0 시작)

두 번째 바이트의 처음 4비트
분할된 QR 코드의 최대 위치

두 번째 바이트 뒤 4비트
패리티 1

세 번째 바이트의 처음 4비트
패리티 2


네, 간단합니다.
보시다시피, 분할 정보가 4 비트 밖에 없기 때문에 최대 16 분할 밖에 할 수 없습니다.



여기에 「00110000 00011001 00110010~」으로 시작되는 QR코드가 있다고 합니다.
16진수로 하면 「30 19 32~」가 됩니다.

앞의 표에 비추면,
첫 번째 바이트의 처음 4비트가 3이므로 이 QR 코드가 분할되어 있음을 알 수 있습니다.
1바이트째의 뒤 4비트가 0이므로, 분할 QR의 1번째라고 알 수 있습니다. (0 시작이므로 첫 번째입니다)
2바이트째의 처음 4비트가 1이므로 QR코드의 총수는 2개인 것을 알 수 있습니다.
두 번째 바이트 뒤의 4비트와 세 번째 바이트의 처음 4비트는 패리티입니다. 두 번째 QR 코드와 동일하므로 ID처럼 사용할 수 있습니다.

덧붙여서, 상기의 QR 코드의 2번째의 바이너리(16진 표기)는 이하와 같습니다.
「31 19 34~」

Swift로 어떻게 얻는가?



AVFoundation에서 QR 코드를 읽을 때 델리게이트 메서드 내에서 검색하는 방법을 설명합니다.
    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
        if let metadataObject = metadataObjects.first {
            guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return }
            guard let readableObjectForQRCode = readableObject.descriptor as? CIQRCodeDescriptor else { return }
            // 16進数のQRコード情報を取得
            let hexQRCodeData = readableObjectForQRCode.errorCorrectedPayload.map { String(format: "%02X", $0)}

            // 分割コードかチェック(trueなら分割コード)      
            let isSeparatedQRCode = hexQRCodeData.first!.hasPrefix("3")

            // 分割コードの総数を取得
            ​​​​​​​​let secondByteFirstHex = hexQRCodeData[1].prefix(1) + 1
            ​​​​​​​​let total = Int(secondByteFirstHex, radix: 16)!

            // 分割コードの位置を取得
            let ​​​​firstByteSecondHex = hexQRCodeData[0].suffix(1)
            let position = Int(firstByteSecondHex, radix: 16)!


        }
    }

AVFoundation에서 QR 코드를 읽는 방법은 다음 기사를 참조하십시오.

htps : // 코 m / 오징어 아사마 y / ms / 58d1 401 98673
htps : // v.ぁsss d. jp / 아 rc c ぇ s / 이오 s 아 v 푹 푹신 치온 /
htps : // v.ぁsss d. jp / 아 rc c ぇ s / 이오 s 아 v 푹 푹신 푹신 아 v v p

요약



그 중 애플이 좋은 느낌의 방법을 제공할 것 같다.
하지만, 우선 QR코드의 사양을 알면 그렇게 어렵지 않기 때문에 별로 불필요한 생각도 한다.
어쨌든 곤란한 사람의 참고가되면 다행입니다!

참고 기사

좋은 웹페이지 즐겨찾기