作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一条 200 字节的消息有一个随机字节损坏。
修复损坏字节的最有效方法是什么?
A Hamming(255,247)代码有 8 个字节的开销,但实现起来很简单。
Reed-Solomon error correction有 2 个字节的开销,但实现起来很复杂。
有没有我忽略的更简单的方法?
最佳答案
我找到了一篇论文,介绍了一种非常适合这种情况的方法——两个字节的开销,易于实现。这是代码:
// Single-byte error correction for messages <255 bytes long
// using two check bytes. Based on "CA-based byte error-correcting code"
// by Chowdhury et al.
//
// rmmh 2013
uint8_t lfsr(uint8_t x) {
return (x >> 1) ^ (-(x&1) & 0x8E);
}
void eccComputeChecks(uint8_t *data, int data_len, uint8_t *out_c0, uint8_t *out_c1) {
uint8_t c0 = 0; // parity: m_0 ^ m_1 ^ ... ^ m_n-1
uint8_t c1 = 0; // lfsr: f^n-1(m_0) ^ f^n(m_1) ^ ... ^ f^0(m_n-1)
for (int i = 0; i < data_len; ++i) {
c0 ^= data[i];
c1 = lfsr(c1 ^ data[i]);
}
*out_c0 = c0;
*out_c1 = c1;
}
void eccEncode(uint8_t *data, int data_len, uint8_t check[2]) {;
eccComputeChecks(data, data_len, &check[0], &check[1]);
}
bool eccDecode(uint8_t *data, int data_len, uint8_t check[2]) {
uint8_t s0, s1;
eccComputeChecks(data, data_len, &s0, &s1);
s0 ^= check[0];
s1 ^= check[1];
if (s0 && s1) {
int error_index = data_len - 255;
while (s1 != s0) { // find i st s1 = lfsr^i(s0)
s1 = lfsr(s1);
error_index++;
}
if (error_index < 0 || error_index >= data_len) {
// multi-byte error?
return false;
}
data[error_index] ^= s0;
} else if (s0 || s1) {
// parity error
}
return true;
}
关于error-correction - 单字节纠错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15996240/
我正在估算从相机到棋盘的距离。但是,只要我远离模式,错误就会线性增加。那是正常的吗?我该如何纠正该错误? 我使用一个简单的线性方程更正了该错误并且它有效但它并不像我认为的那样依赖于相机参数,因此校正将
我要在带有标记顶点和标记有向边的图上寻找一种不精确的图匹配算法。我的任务是检测两个图表的变化以将它们显示给开发人员(想想颠覆差异)。我已经实现了基于禁忌搜索 ( this ) 的优化算法,但我无法让该
我是一名优秀的程序员,十分优秀!