[Aaru.Checksums] Reformat and cleanup.

This commit is contained in:
2023-10-03 22:45:06 +01:00
parent 03a488e834
commit 3429b9012b
28 changed files with 2656 additions and 2416 deletions

View File

@@ -88,69 +88,25 @@ public class ReedSolomon
public void InitRs(int n, int k, int m)
{
_pp = m switch
{
2 => new[]
{
1, 1, 1
},
3 => new[]
{
1, 1, 0, 1
},
4 => new[]
{
1, 1, 0, 0, 1
},
5 => new[]
{
1, 0, 1, 0, 0, 1
},
6 => new[]
{
1, 1, 0, 0, 0, 0, 1
},
7 => new[]
{
1, 0, 0, 1, 0, 0, 0, 1
},
8 => new[]
{
1, 0, 1, 1, 1, 0, 0, 0, 1
},
9 => new[]
{
1, 0, 0, 0, 1, 0, 0, 0, 0, 1
},
10 => new[]
{
1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1
},
11 => new[]
{
1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
},
12 => new[]
{
1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1
},
13 => new[]
{
1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
},
14 => new[]
{
1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1
},
15 => new[]
{
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
},
16 => new[]
{
1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1
},
_ => throw new ArgumentOutOfRangeException(nameof(m), Localization.m_must_be_between_2_and_16_inclusive)
};
{
2 => new[] { 1, 1, 1 },
3 => new[] { 1, 1, 0, 1 },
4 => new[] { 1, 1, 0, 0, 1 },
5 => new[] { 1, 0, 1, 0, 0, 1 },
6 => new[] { 1, 1, 0, 0, 0, 0, 1 },
7 => new[] { 1, 0, 0, 1, 0, 0, 0, 1 },
8 => new[] { 1, 0, 1, 1, 1, 0, 0, 0, 1 },
9 => new[] { 1, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
10 => new[] { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1 },
11 => new[] { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
12 => new[] { 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1 },
13 => new[] { 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
14 => new[] { 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 },
15 => new[] { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
16 => new[] { 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1 },
_ => throw new ArgumentOutOfRangeException(
nameof(m), Localization.m_must_be_between_2_and_16_inclusive)
};
_mm = m;
_kk = k;
@@ -238,7 +194,7 @@ public class ReedSolomon
{
int i;
int mask = 1;
var mask = 1;
_alphaTo[_mm] = 0;
for(i = 0; i < _mm; i++)
@@ -264,7 +220,7 @@ public class ReedSolomon
for(i = _mm + 1; i < _nn; i++)
{
if(_alphaTo[i - 1] >= mask)
_alphaTo[i] = _alphaTo[_mm] ^ ((_alphaTo[i - 1] ^ mask) << 1);
_alphaTo[i] = _alphaTo[_mm] ^ (_alphaTo[i - 1] ^ mask) << 1;
else
_alphaTo[i] = _alphaTo[i - 1] << 1;
@@ -304,10 +260,12 @@ public class ReedSolomon
* (@**(B0+i-1) + x)
*/
for(int j = i - 1; j > 0; j--)
{
if(_gg[j] != 0)
_gg[j] = _gg[j - 1] ^ _alphaTo[Modnn(_indexOf[_gg[j]] + B0 + i - 1)];
else
_gg[j] = _gg[j - 1];
}
/* Gg[0] can never be zero */
_gg[0] = _alphaTo[Modnn(_indexOf[_gg[0]] + B0 + i - 1)];
@@ -343,8 +301,10 @@ public class ReedSolomon
for(i = _kk - 1; i >= 0; i--)
{
if(_mm != 8)
{
if(data[i] > _nn)
return -1; /* Illegal symbol */
}
int feedback = _indexOf[data[i] ^ bb[_nn - _kk - 1]];
@@ -352,17 +312,19 @@ public class ReedSolomon
{
/* feedback term is non-zero */
for(int j = _nn - _kk - 1; j > 0; j--)
{
if(_gg[j] != _a0)
bb[j] = bb[j - 1] ^ _alphaTo[Modnn(_gg[j] + feedback)];
else
bb[j] = bb[j - 1];
}
bb[0] = _alphaTo[Modnn(_gg[0] + feedback)];
}
else
{
/* feedback term is zero. encoder becomes a
* single-byte shifter */
* single-byte shifter */
for(int j = _nn - _kk - 1; j > 0; j--)
bb[j] = bb[j - 1];
@@ -397,25 +359,27 @@ public class ReedSolomon
throw new UnauthorizedAccessException(Localization.Trying_to_calculate_RS_without_initializing);
erasPos = new int[_nn - _kk];
int i, j;
int q, tmp;
int[] recd = new int[_nn];
int[] lambda = new int[_nn - _kk + 1]; /* Err+Eras Locator poly */
int[] s = new int[_nn - _kk + 1]; /* syndrome poly */
int[] b = new int[_nn - _kk + 1];
int[] t = new int[_nn - _kk + 1];
int[] omega = new int[_nn - _kk + 1];
int[] root = new int[_nn - _kk];
int[] reg = new int[_nn - _kk + 1];
int[] loc = new int[_nn - _kk];
int count;
int i, j;
int q, tmp;
var recd = new int[_nn];
var lambda = new int[_nn - _kk + 1]; /* Err+Eras Locator poly */
var s = new int[_nn - _kk + 1]; /* syndrome poly */
var b = new int[_nn - _kk + 1];
var t = new int[_nn - _kk + 1];
var omega = new int[_nn - _kk + 1];
var root = new int[_nn - _kk];
var reg = new int[_nn - _kk + 1];
var loc = new int[_nn - _kk];
int count;
/* data[] is in polynomial form, copy and convert to index form */
for(i = _nn - 1; i >= 0; i--)
{
if(_mm != 8)
{
if(data[i] > _nn)
return -1; /* Illegal symbol */
}
recd[i] = _indexOf[data[i]];
}
@@ -423,18 +387,20 @@ public class ReedSolomon
/* first form the syndromes; i.e., evaluate recd(x) at roots of g(x)
* namely @**(B0+i), i = 0, ... ,(NN-KK-1)
*/
int synError = 0;
var synError = 0;
for(i = 1; i <= _nn - _kk; i++)
{
tmp = 0;
for(j = 0; j < _nn; j++)
{
if(recd[j] != _a0) /* recd[j] in index form */
tmp ^= _alphaTo[Modnn(recd[j] + ((B0 + i - 1) * j))];
tmp ^= _alphaTo[Modnn(recd[j] + (B0 + i - 1) * j)];
}
synError |= tmp; /* set flag if non-zero syndrome =>
* error */
* error */
/* store syndrome in index form */
s[i] = _indexOf[tmp];
@@ -476,18 +442,20 @@ public class ReedSolomon
q = 1;
for(j = 1; j <= noEras; j++)
{
if(reg[j] != _a0)
{
reg[j] = Modnn(reg[j] + j);
q ^= _alphaTo[reg[j]];
}
}
if(q != 0)
continue;
/* store root and error location
* number indices
*/
* number indices
*/
root[count] = i;
loc[count] = _nn - i;
count++;
@@ -524,12 +492,14 @@ public class ReedSolomon
{
/* r is the step number */
/* Compute discrepancy at the r-th step in poly-form */
int discrR = 0;
var discrR = 0;
for(i = 0; i < r; i++)
{
if(lambda[i] != 0 &&
s[r - i] != _a0)
discrR ^= _alphaTo[Modnn(_indexOf[lambda[i]] + s[r - i])];
}
discrR = _indexOf[discrR]; /* Index form */
@@ -545,10 +515,12 @@ public class ReedSolomon
t[0] = lambda[0];
for(i = 0; i < _nn - _kk; i++)
{
if(b[i] != _a0)
t[i + 1] = lambda[i + 1] ^ _alphaTo[Modnn(discrR + b[i])];
else
t[i + 1] = lambda[i + 1];
}
if(2 * el <= r + noEras - 1)
{
@@ -573,7 +545,7 @@ public class ReedSolomon
}
/* Convert lambda to index form and compute deg(lambda(x)) */
int degLambda = 0;
var degLambda = 0;
for(i = 0; i < _nn - _kk + 1; i++)
{
@@ -597,11 +569,13 @@ public class ReedSolomon
q = 1;
for(j = degLambda; j > 0; j--)
{
if(reg[j] != _a0)
{
reg[j] = Modnn(reg[j] + j);
q ^= _alphaTo[reg[j]];
}
}
if(q != 0)
continue;
@@ -628,7 +602,7 @@ public class ReedSolomon
* Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo
* x**(NN-KK)). in index form. Also find deg(omega).
*/
int degOmega = 0;
var degOmega = 0;
for(i = 0; i < _nn - _kk; i++)
{
@@ -636,9 +610,11 @@ public class ReedSolomon
j = degLambda < i ? degLambda : i;
for(; j >= 0; j--)
{
if(s[i + 1 - j] != _a0 &&
lambda[j] != _a0)
tmp ^= _alphaTo[Modnn(s[i + 1 - j] + lambda[j])];
}
if(tmp != 0)
degOmega = i;
@@ -654,19 +630,23 @@ public class ReedSolomon
*/
for(j = count - 1; j >= 0; j--)
{
int num1 = 0;
var num1 = 0;
for(i = degOmega; i >= 0; i--)
{
if(omega[i] != _a0)
num1 ^= _alphaTo[Modnn(omega[i] + (i * root[j]))];
num1 ^= _alphaTo[Modnn(omega[i] + i * root[j])];
}
int num2 = _alphaTo[Modnn((root[j] * (B0 - 1)) + _nn)];
int den = 0;
int num2 = _alphaTo[Modnn(root[j] * (B0 - 1) + _nn)];
var den = 0;
/* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */
for(i = Min(degLambda, _nn - _kk - 1) & ~1; i >= 0; i -= 2)
{
if(lambda[i + 1] != _a0)
den ^= _alphaTo[Modnn(lambda[i + 1] + (i * root[j]))];
den ^= _alphaTo[Modnn(lambda[i + 1] + i * root[j])];
}
if(den == 0)
{