QR 코드 체크섬을 검증하고 C#에서 내결함성을 적용하는 방법

This article was translated from English: Does it need improvement?
Translated
View the article in English

QR 코드는 인코딩 수준에서 Reed-Solomon 오류 수정을 포함하여 — 체크섬과 패리티 데이터가 기호 자체에 포함되어 있으며 읽기 API에 포함되어 있지 않습니다. 링크된 QrReader.Read()QrResult를 반환하면, Reed-Solomon 복호화가 이미 성공한 것입니다. 오류 수정을 통해 데이터를 복구할 수 없는 경우 — 교정 수준의 용량을 초과하는 과도한 손상으로 인해 — QR 코드는 결과에 표시되지 않습니다. "부분적으로 디코딩된" 상태는 없습니다.

이는 IronQR에서의 오류 내성은 두 가지 경계에서 작동됨을 의미합니다: 기록 시에 선택한 오류 수정을 통한 내성 수준(기호가 견딜 수 있는 물리적 손상의 양을 결정하는 요소)과 읽을 때 적용되는 검증 로그르을 적용하여(해독된 데이터가 하류 사용 전에 애플리케이션 요구사항을 충족하는지 여부를 결정하는 요소).

체크섬을 검증하기 위한 빠른 시작 QR 코드

QR 코드를 읽고 디코딩이 성공했는지 여부를 확인합니다 -- 빈 결과가 아닌 경우 Reed-Solomon 체크섬이 통과했음을 의미합니다.

  1. NuGet 패키지 관리자를 사용하여 https://www.nuget.org/packages/IronQR 설치하기

    PM > Install-Package IronQR
  2. 다음 코드 조각을 복사하여 실행하세요.

    using IronQr;
    using IronSoftware.Drawing;
    
    var reader = new QrReader();
    IEnumerable<QrResult> results = reader.Read(new QrImageInput("label.png"));
    
    if (!results.Any())
    {
        Console.WriteLine("No QR code detected or decoding failed.");
        return;
    }
    
    Console.WriteLine(results.First().Value);
  3. 실제 운영 환경에서 테스트할 수 있도록 배포하세요.

    무료 체험판으로 오늘 프로젝트에서 IronQR 사용 시작하기

    arrow pointer

QR 코드 체크섬을 검증하는 방법?

QR 코드는 Reed-Solomon 오류 수정을 사용하여 인코딩된 데이터의 손상을 감지하고 복구합니다. 변환 수준 — 낮음 (7%), 중간 (15%), 4등분 (25%), 또는 높음 (30%) — 이는 몇 퍼센트의 코드워드를 잃어도 복구 가능한지를 결정합니다. QrOptions를 통해 생성 시 설정되며 오류 수정 방법에서 구성에 대해 자세히 설명합니다.

읽는 쪽에서 체크섬 검증은 디코딩 동안 내부적으로 이루어집니다. IronQR의 ML 기반 스캐너는 QR 기호를 찾아서 데이터 모듈을 추출한 후, Reed-Solomon 디코드를 실행하여 성공하거나 결과를 폐기합니다. QrResult 클래스는 .Confidence 속성을 노출하지 않습니다 — 반환된 IEnumerable<QrResult>에서 결과가 존재하면, 체크섬이 통과된 것입니다. 디코딩에 실패한 경우, 컬렉션이 비어 있습니다.

이 이진 결과 — 디코딩되었는지 여부 — 는 실질적인 체크섬 검증입니다. 애플리케이션 수준의 관심사는 "체크섬이 통과되었는가?"에서 "디코딩된 데이터가 애플리케이션이 예상한 것인가?"로 이동합니다.

:path=/static-assets/qr/content-code-examples/how-to/checksum-and-fault-tolerance/checksum-validation.cs
using IronQr;
using IronSoftware.Drawing;

var reader = new QrReader();
IEnumerable<QrResult> results = reader.Read(new QrImageInput("damaged-label.png"));

// Reed-Solomon decoding is pass/fail — presence in results means valid checksum
if (!results.Any())
{
    // Decoding failed entirely — damage exceeded the error correction capacity
    Console.WriteLine("QR code could not be decoded. Consider re-scanning or using a higher error correction level at generation time.");
    return;
}

foreach (QrResult result in results)
{
    // Decoded successfully — validate the content matches expected format
    if (string.IsNullOrWhiteSpace(result.Value))
    {
        Console.WriteLine("QR decoded but produced an empty value.");
        continue;
    }

    Console.WriteLine($"Valid QR: {result.Value}");
}
$vbLabelText   $csharpLabel

물리적 손상에 대한 높은 복구성을 필요로 하는 시스템은 더 높은 오류 수정 수준을 가진 QR 코드를 생성하여 해결합니다. 오류 수정 방법QrErrorCorrectionLevel.HighQrOptions를 통해 설정하는 방법을 보여줍니다 — 이는 큰 기호로 최대 30% 데이터 손실을 복구합니다.

QR 코드 읽기에서 형식 인식을 다루는 방법은?

IronQR은 세 가지 QR 인코딩 형식을 지원합니다: 표준 QRCode, MicroQRCodeRMQRCode(직사각형 마이크로 QR). 스캐너는 읽는 동안 형식을 자동으로 감지하며, 서로 다른 유형을 처리하기 위해 구성할 필요가 없습니다. 스캔 후 QrResult.QrType 필드는 감지된 형식을 QrEncoding 열거형 값으로 노출합니다.

QrImageInput 래퍼는 여러 입력 유형을 허용합니다. 파일 경로 문자열, AnyBitmap, byte[] 또는 Stream에서 구성할 수 있습니다. PDF의 경우 QrPdfInput을 사용하세요. 스캔 모드 또한 지정할 수 있습니다: QrScanMode.Auto는 최대 신뢰성을 위해 ML 감지와 고전적인 스캔을 결합하며, OnlyDetectionModel는 더 빠른 처리량을 위해 ML 모델만 사용하고, OnlyBasicScan는 사전 처리된 고품질 이미지를 위해 ML을 완전히 생략합니다.

:path=/static-assets/qr/content-code-examples/how-to/checksum-and-fault-tolerance/format-awareness.cs
using IronQr;
using IronSoftware.Drawing;
using IronQr.Enum;

// Read from an image file with ML + classic scan (default)
var reader = new QrReader();
IEnumerable<QrResult> results = reader.Read(new QrImageInput("product-label.png"));

foreach (QrResult result in results)
{
    // Inspect the detected QR format
    Console.WriteLine($"Format: {result.QrType}");   // QRCode, MicroQRCode, or RMQRCode
    Console.WriteLine($"Value:  {result.Value}");

    // Url is non-null only if Value is a valid URI
    if (result.Url != null)
    {
        Console.WriteLine($"URI:    {result.Url.AbsoluteUri}");
    }

    // Corner coordinates for positional context
    Console.WriteLine($"Corners: {result.Points.Length} points detected");
}

// Read from a bitmap with ML-only mode for faster throughput
var bitmap = AnyBitmap.FromFile("camera-capture.jpg");
var fastResults = reader.Read(new QrImageInput(bitmap, QrScanMode.OnlyDetectionModel));
$vbLabelText   $csharpLabel

.QrType 필드는 애플리케이션이 특정 형식을 기대할 때 유용합니다. 예를 들어, 표준 QR 코드를 생성하는 창고 시스템은 이미지에서 노이즈 또는 관계없는 라벨을 나타낼 수 있는 예상치 못한 MicroQRCode 또는 RMQRCode 감지를 필터링할 수 있습니다. 각 형식은 다른 용량 특성을 가지고 있습니다: 표준 QR은 최대 7,089개의 숫자 문자를 지원하며, MicroQR은 최대 35까지 처리하고, RMQRCode는 제한된 라벨 공간에 대한 직사각형 형태를 제공합니다. QR 코드 읽기 튜토리얼은 다중 프레임 TIFF 및 PDF 페이지를 포함한 추가 입력 시나리오를 다룹니다.

QR 코드 결과에 널 체크를 적용하는 방법은?

QrReader.Read()IEnumerable<QrResult>을 반환합니다. QR 코드가 발견되지 않았을 때 컬렉션이 비어 있지만, 이는 null이 아닙니다. 그러나 개별 QrResult 속성에는 여전히 유효성 검사가 필요합니다: .Value은 이론상 비어 있을 수 있는 readonly string이고, .Url는 값이 유효한 URI가 아닐 때 null을 반환합니다. .Points 배열은 모서리 좌표를 포함하고 있으며, 결과마다 채워집니다.

방어적 패턴은 세 가지를 검사합니다: 컬렉션 수, 개별 .Value 무결성 및 데이터를 다른 시스템에 전달하기 전의 유형/URI 유효성.

:path=/static-assets/qr/content-code-examples/how-to/checksum-and-fault-tolerance/null-checking-validator.cs
using IronQr;
using IronSoftware.Drawing;
using System.Collections.Generic;
using System.Linq;

public static class QrValidator
{
    public static List<QrResult> GetValidResults(
        string imagePath,
        QrEncoding? expectedFormat = null)
    {
        var reader = new QrReader();
        IEnumerable<QrResult> results = reader.Read(new QrImageInput(imagePath));

        // Guard: no QR codes detected
        if (!results.Any())
            return new List<QrResult>();

        return results
            .Where(r => !string.IsNullOrWhiteSpace(r.Value))
            .Where(r => expectedFormat == null || r.QrType == expectedFormat)
            .ToList();
    }
}

// Usage — only accept standard QR codes with non-empty values
var validated = QrValidator.GetValidResults(
    "shipping-manifest.png",
    expectedFormat: QrEncoding.QRCode);

if (validated.Count == 0)
{
    Console.WriteLine("No valid QR codes found for processing.");
    return;
}

foreach (var qr in validated)
{
    // Safe for downstream: value is non-empty, format is verified
    SendToInventoryApi(qr.Value, qr.Url?.AbsoluteUri);
}
$vbLabelText   $csharpLabel

유효성 검사기는 빈 리스트를 반환하며(null 절대 아님), 이는 호출 지점에서 null 검사를 제거합니다. 선택적 expectedFormat 매개변수는 형식 게이트 역할을 하며, 호출 코드는 예상되는 QrEncoding와 일치하는 결과만 받습니다. .Url 속성에 대해 null 조건부 연산자(?.)는 URI 및 비-URI 페이로드를 안전하게 처리합니다.

비동기 워크플로의 경우, 동일한 패턴이 QrReader.ReadAsync()에 적용됩니다 — 반환 유형은 Task<IEnumerable<QrResult>>이며, 호출과 래핑되지 않은 컬렉션에 동일한 보호 장치를 적용합니다.

다음 단계

QR 코드 오류 허용 범위는 두 가지 레이어로 확대됩니다: 생성 시 설정된 리드-솔로몬 오류 수정 수준과 읽기 후 적용된 애플리케이션 수준의 검증입니다. 오류 수정 방법을 사용하여 기록 시 회복력을 구성하고, 위 패턴을 사용하여 읽기 시 결과를 하류 시스템에 들어가기 전에 유효성을 검사합니다.

전체 속성 표면을 위한 QrResult API 참조, 입력 형식 옵션을 위한 읽기 방법, 고급 스캔 구성을 위한 코드 예시를 탐색하십시오.

라이선스 옵션 보기는 $499부터 시작합니다.

A PHP Error was encountered

Severity: Warning

Message: Illegal string offset 'name'

Filename: sections/author_component.php

Line Number: 18

Backtrace:

File: /var/www/ironpdf.com/application/views/main/sections/author_component.php
Line: 18
Function: _error_handler

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 63
Function: view

File: /var/www/ironpdf.com/application/views/products/sections/three_column_docs_page_structure.php
Line: 64
Function: main_view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 88
Function: view

File: /var/www/ironpdf.com/application/views/products/how-to/index.php
Line: 2
Function: view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 88
Function: view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 552
Function: view

File: /var/www/ironpdf.com/application/controllers/Products/Howto.php
Line: 31
Function: render_products_view

File: /var/www/ironpdf.com/index.php
Line: 292
Function: require_once

A PHP Error was encountered

Severity: Warning

Message: Illegal string offset 'title'

Filename: sections/author_component.php

Line Number: 38

Backtrace:

File: /var/www/ironpdf.com/application/views/main/sections/author_component.php
Line: 38
Function: _error_handler

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 63
Function: view

File: /var/www/ironpdf.com/application/views/products/sections/three_column_docs_page_structure.php
Line: 64
Function: main_view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 88
Function: view

File: /var/www/ironpdf.com/application/views/products/how-to/index.php
Line: 2
Function: view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 88
Function: view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 552
Function: view

File: /var/www/ironpdf.com/application/controllers/Products/Howto.php
Line: 31
Function: render_products_view

File: /var/www/ironpdf.com/index.php
Line: 292
Function: require_once

A PHP Error was encountered

Severity: Warning

Message: Illegal string offset 'comment'

Filename: sections/author_component.php

Line Number: 48

Backtrace:

File: /var/www/ironpdf.com/application/views/main/sections/author_component.php
Line: 48
Function: _error_handler

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 63
Function: view

File: /var/www/ironpdf.com/application/views/products/sections/three_column_docs_page_structure.php
Line: 64
Function: main_view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 88
Function: view

File: /var/www/ironpdf.com/application/views/products/how-to/index.php
Line: 2
Function: view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 88
Function: view

File: /var/www/ironpdf.com/application/libraries/Render.php
Line: 552
Function: view

File: /var/www/ironpdf.com/application/controllers/Products/Howto.php
Line: 31
Function: render_products_view

File: /var/www/ironpdf.com/index.php
Line: 292
Function: require_once

시작할 준비 되셨나요?
Nuget 다운로드 61,359 | 버전: 2026.3 방금 출시되었습니다
Still Scrolling Icon

아직도 스크롤하고 계신가요?

빠른 증거를 원하시나요? PM > Install-Package IronQR
샘플을 실행하세요 URL이 QR 코드로 바뀌는 것을 확인해 보세요.