欧盟数字新冠证书(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); } }
关键步骤说明
- Base45解码修正:直接保留
FromBase45()返回的字节数组,不要做任何字符串转换——因为这是二进制压缩数据,不是文本。 - Zlib解压:使用
ZlibStream处理带zlib头的数据流,和Python的zlib.decompress()行为完全一致。如果遇到解压错误,检查Base45解码后的字节是否正确(可以和Python代码的decoded变量对比字节数组)。 - COSE消息处理:
Cose库的CoseMessage.Decode()方法会解析COSE结构,直接获取Payload(就是CBOR编码的内容),和Python的CoseMessage.decode()逻辑一致,这里跳过了签名验证(和原Python代码保持相同)。 - 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
相关产品推荐
相关产品推荐

