我想在嘈杂的通道上传输二进制数据。
我读到Reed-Solomon是检测错误的一种很好的ECC算法。问题是我不了解此算法的输入。
这是我对zxing.net的幼稚失败尝试:
int[] toEncode = { 123,232,432}; var gf = GenericGF.AZTEC_DATA_12; ReedSolomonEncoder rse = new ReedSolomonEncoder(gf); rse.encode(toEncode, 2); ReedSolomonDecoder rsd = new ReedSolomonDecoder(gf); rse.encode(toEncode, 2);
请向我解释编码器和解码器的输入。
这是您在此处使用的实现:ReedSolomonEncoder.cs吗?
如果是这样,要用M个数据校正整数编码N个整数,则需要传递长度为N + M的数组。您的数据应该在前N个索引中,并且代码看起来要在最后M个条目的末尾添加。
另外,请注意编码器中的以下限制:
更新:此处是更新版本:http: //zxingnet.codeplex.com/。它的ReedSolomonEncoder.cs的最新版本没有此限制。
此类实现在处理QR码时使用的Reed- Solomon编码方案。里德所罗门编码的简短描述在这里:里德所罗门编码。
编码选择为“ QR_CODE_FIELD_256”(这可能对您来说是一个合理的选择),意味着将在消息的字节大小的块(“符号”)上生成纠错码,这意味着最大消息长度(要编码的数据加上错误纠正代码)的长度为255个字节。如果您要发送更多数据,则需要将其分成多个块。
更新2:使用QR_CODE_FIELD_256,您的整数也必须介于0到255之间,因此要编码常规字节流,您需要将每个字节放入整数数组中的单独整数中,传递int数组(加上错误空间)校正码),然后再转换为(更大)字节数组。反之则为解码。