如何获取ZXING二维码解码器纠错解码前的比特流以计算BER
我之前折腾过类似的需求——要对比两个二维码的BER,核心就是得拿到纠错解码前的原始比特流,毕竟BER统计的是纠错前的错误比特占比嘛。下面给你拆解ZXING里的关键步骤,帮你精准拿到这个数据:
先摸清楚ZXING的解码流程脉络
ZXING的二维码解码核心逻辑在QRCodeReader和Decoder类里。纠错解码是整个流程的后半段,在此之前,程序会先完成二维码的定位、格式信息解码、版本信息解码,然后从矩阵中提取出还没经过纠错的原始码字比特流。精准定位存储原始比特流的变量
重点看BitMatrixParser这个类——它负责把二维码的BitMatrix转换成可处理的比特序列。在这个类里,会有一个BitArray类型的变量(Java版本里通常叫codewords或直接是内部维护的BitArray实例;Python版本里在qrcode/decoder.py的decode函数里是bits变量),这个就是你要找的、纠错前的原始比特流。拿Java版本举个实际的例子,你可以在
Decoder的解码流程中,在调用Reed-Solomon纠错之前,提取这个比特流并转成二进制字符串:// 假设你已经通过BitMatrix创建了parser实例 BitMatrixParser parser = new BitMatrixParser(bitMatrix); // 获取纠错前的原始比特流 BitArray rawPreCorrectionBits = parser.getBitArray(); // 部分版本可能是getCodewords() // 转成二进制字符串 StringBuilder binaryStr = new StringBuilder(); for (int i = 0; i < rawPreCorrectionBits.size(); i++) { binaryStr.append(rawPreCorrectionBits.get(i) ? '1' : '0'); } String preCorrectionBitStream = binaryStr.toString();调试/修改代码的小技巧
如果是调试阶段,你可以直接在Decoder类中,找到调用ReedSolomonDecoder.decode()的代码块,在这一行之前插入日志或者直接输出原始比特流。要是需要长期获取这个数据,也可以给BitMatrixParser加一个公开的方法,专门返回这个原始比特流,避免修改核心逻辑时出问题。注意:不同语言的ZXING实现细节有差异,比如Python版本里,你直接在
decoder.py的decode函数中,拿到bits变量后,用''.join(['1' if b else '0' for b in bits])就能转成二进制字符串。计算BER的小提醒
拿到两个二维码的纠错前比特流后,一定要确保它们的长度完全一致(必须是相同版本、相同纠错等级的二维码),然后逐比特对比错误数量,用错误比特数除以总比特数就是BER了。
内容的提问来源于stack exchange,提问作者Rishabh1906

