You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

欧盟数字新冠证书(EU DGC)二维码解码方案从Python到C#(.NET Core)的迁移及Zlib解压问题求助

解决EU数字新冠证书(EU DGC)C#解码问题

首先,你之前的代码里有个关键错误:Base45解码后得到的是二进制字节流(Zlib压缩数据),不能转成ASCII字符串再转回字节,这会破坏原始二进制数据,导致后续解压失败。接下来我会一步步帮你完成完整的解码流程,推荐使用以下NuGet包:

所需NuGet包

  • Rystem.Text.Base45:你已经在使用的Base45解码库
  • System.IO.Compression.Zlib:用于Zlib解压(.NET Core 3.0+可直接使用,低版本需安装此包)
  • PeterO.Cbor:可靠的CBOR解析库
  • Cose:用于解码COSE消息(替代Python的cose.messages)

完整解码代码示例

using System;
using System.IO;
using System.IO.Compression;
using PeterO.Cbor;
using Cose; // 来自Cose NuGet包

public class EudgcDecoder
{
    public static string DecodeQrToJson(string qrData)
    {
        // 1. 移除HC1:前缀
        var payloadWithoutHeader = qrData.Substring(4);
        
        // 2. Base45解码(直接得到二进制字节,不要转字符串!)
        byte[] decodedBase45 = payloadWithoutHeader.FromBase45();
        
        // 3. Zlib解压
        byte[] decompressedData;
        using (var inputStream = new MemoryStream(decodedBase45))
        using (var zlibStream = new ZlibStream(inputStream, CompressionMode.Decompress))
        using (var outputStream = new MemoryStream())
        {
            zlibStream.CopyTo(outputStream);
            decompressedData = outputStream.ToArray();
        }
        
        // 4. 解码COSE消息(跳过签名验证,和Python代码一致)
        var coseMessage = CoseMessage.Decode(decompressedData);
        byte[] cborPayload = coseMessage.Payload;
        
        // 5. CBOR转JSON
        var cborReader = CBORObject.DecodeFromBytes(cborPayload);
        return cborReader.ToJSONString();
    }

    // 测试用例
    public static void Main(string[] args)
    {
        string testQrData = "HC1:..." // 替换为你的EU DGC二维码字符串
        string jsonResult = DecodeQrToJson(testQrData);
        Console.WriteLine(jsonResult);
    }
}

关键步骤说明

  1. Base45解码修正:直接保留FromBase45()返回的字节数组,不要做任何字符串转换——因为这是二进制压缩数据,不是文本。
  2. Zlib解压:使用ZlibStream处理带zlib头的数据流,和Python的zlib.decompress()行为完全一致。如果遇到解压错误,检查Base45解码后的字节是否正确(可以和Python代码的decoded变量对比字节数组)。
  3. COSE消息处理:Cose库的CoseMessage.Decode()方法会解析COSE结构,直接获取Payload(就是CBOR编码的内容),和Python的CoseMessage.decode()逻辑一致,这里跳过了签名验证(和原Python代码保持相同)。
  4. CBOR转JSON:PeterO.Cbor的CBORObject提供了便捷的ToJSONString()方法,直接将CBOR数据转换为格式化的JSON字符串,效果和Python的json.dumps()一致。

可能遇到的问题排查

  • 如果Zlib解压失败:检查Base45解码后的字节是否正确,确认二维码字符串没有被截断或修改。
  • 如果COSE解码报错:确保使用的Cose库版本兼容,或者尝试替换为NetCoreCose库(API类似)。
  • CBOR转JSON异常:确认COSE Payload是有效的CBOR数据,这一步通常不会出错,只要前面的步骤正确。

内容的提问来源于stack exchange,提问作者Adam Balcar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:56:32