C# 汉明码-纠错功能用于纠正消息位而不是控制位
您好,我无法在实现汉明码的代码中找出错误。基本上,它所做的是:获取一条消息(比如ASCII a:0110001)乘以矩阵H,从而为该消息生成控制位(奇偶校验位)。我们这样做是为了确保如果某些位(在我的例子中,最大2位)传输错误,它仍然可以成功解码。我的矩阵H是8x16。所以编码的消息看起来像:011000011011110(位0-7是消息位,8-15是控制位) 如果我的控制位有2个错误,我的代码就无法解码消息。如果消息位中有2个错误,它将成功解码。如果任何地方有1个错误,它也会成功解码。当我改变索引14和15中的两位时,它会检测到索引6和7中的错误。我认为我的错误在这个函数的某个地方:C# 汉明码-纠错功能用于纠正消息位而不是控制位,c#,character-encoding,telecommunication,hamming-code,hamming-window,C#,Character Encoding,Telecommunication,Hamming Code,Hamming Window,您好,我无法在实现汉明码的代码中找出错误。基本上,它所做的是:获取一条消息(比如ASCII a:0110001)乘以矩阵H,从而为该消息生成控制位(奇偶校验位)。我们这样做是为了确保如果某些位(在我的例子中,最大2位)传输错误,它仍然可以成功解码。我的矩阵H是8x16。所以编码的消息看起来像:011000011011110(位0-7是消息位,8-15是控制位) 如果我的控制位有2个错误,我的代码就无法解码消息。如果消息位中有2个错误,它将成功解码。如果任何地方有1个错误,它也会成功解码。当我改
internal static void CorrectChar(List<int> message, List<int> errorVector, int[,] matrix_H)
{
if (errorVector.Count != ROWS)
{
throw new ArgumentOutOfRangeException("Liczba bitów wiadomości i liczba kolumn macierzy kodowej są różne.");
}
else
{
int wrongBitIndex = -1;
int wrongBitIndex1 = -1;
int wrongBitIndex2 = -1;
// szukanie kolumny macierzy H identycznej do wektora błędu
for (int i = 0; i < COLUMNS; i++)
{
bool identical = true;
for (int j = 0; j < ROWS; j++)
{
if (matrix_H[j, i] != errorVector[j])
{
identical = false;
break;
}
}
if (identical)
{
wrongBitIndex = i;
break;
}
}
// searching matrix columns which sum equals errorVector
if (wrongBitIndex == -1)
{
for (int i = 0; i < COLUMNS - 1; i++)
{
bool identical = false;
for (int j = i + 1; j < COLUMNS; j++)
{
identical = true;
for (int k = 0; k < ROWS; k++)
{
bool tmp1 = matrix_H[k, i] == 1;
bool tmp2 = matrix_H[k, j] == 1;
bool tmp3 = errorVector[k] == 1;
Console.WriteLine($"ijk=({i},{j},{k} m[{k}, {i}] ^ m[{k},{j}]={tmp3 != tmp1 ^ tmp2} errorVctor[{k}]={tmp3}");
if (tmp3 != tmp1 ^ tmp2)
{
//Console.WriteLine($"ijk=({i},{j},{k} m[{k}, {i}] ^ m[{k},{j}]={tmp3 != tmp1 ^ tmp2} errorVctor[{k}]={tmp3}");
identical = false; //XOR NA WYBRANYCH KOLUMNACH MACIERZY H - SPRAWDZENIE CZY SA 2 BLEDY
break;
}
}
if (identical)
{
//Console.WriteLine($"======IDENTICAL======\nij=({i},{j})");
wrongBitIndex1 = i;
wrongBitIndex2 = j;
i = COLUMNS;
break;
}
}
//if (identical)
//{
// break;
//}
}
}
if (wrongBitIndex != -1)
{
// korekcja jednego błędu
FlipBit(message, wrongBitIndex);
Console.Write($"Poprawiam 1 błąd na pozycji: {wrongBitIndex + 1}... ");
}
else if (wrongBitIndex1 != -1 && wrongBitIndex2 != -1)
{
// korekcja dwóch błędów
FlipBit(message, wrongBitIndex1);
FlipBit(message, wrongBitIndex2);
Console.Write($"Poprawiam 2 błędy na pozycjach: {wrongBitIndex1 + 1} i {wrongBitIndex2 + 1}... ");
}
Console.WriteLine($"poprawnie zakodowana wiadomość ma postać:\n{Logic.ToString(message)}");
}
}
内部静态void CorrectChar(列表消息、列表错误向量、int[,]矩阵)
{
if(errorVector.Count!=行)
{
抛出新的范围例外论证(“Liczba bitów wiadomości i Liczba kolumn macierzy kodowej sąróne”);
}
其他的
{
int-errobitindex=-1;
int错误位INDEX1=-1;
int-errobitindex2=-1;
//斯库卡尼·科鲁姆尼·麦克尔齐的身份证明
对于(int i=0;i
您可以在my github上找到的完整代码:
我花了太多时间研究这个函数,以至于我不能再批判性地思考这个代码了