mirror of
https://github.com/status-im/qzxing.git
synced 2025-02-16 21:06:43 +00:00
resolved bug in ReedSolomon encoder. Now the encoding tests are successfull but still the images produced can not be decoded. One step closer to #10
This commit is contained in:
parent
e3152c2e3e
commit
e5770ffaca
@ -49,8 +49,8 @@ GenericGF::GenericGF(int primitive_, int size_, int b)
|
||||
}
|
||||
|
||||
void GenericGF::initialize() {
|
||||
expTable.resize(size);
|
||||
logTable.resize(size);
|
||||
expTable = std::vector<int>(size);
|
||||
logTable = std::vector<int>(size);
|
||||
|
||||
int x = 1;
|
||||
|
||||
@ -66,12 +66,14 @@ void GenericGF::initialize() {
|
||||
logTable[expTable[i]] = i;
|
||||
}
|
||||
//logTable[0] == 0 but this should never be used
|
||||
zero =
|
||||
Ref<GenericGFPoly>(new GenericGFPoly(Ref<GenericGF>(this), ArrayRef<int>(new Array<int>(1))));
|
||||
zero->getCoefficients()[0] = 0;
|
||||
one =
|
||||
Ref<GenericGFPoly>(new GenericGFPoly(Ref<GenericGF>(this), ArrayRef<int>(new Array<int>(1))));
|
||||
one->getCoefficients()[0] = 1;
|
||||
ArrayRef<int> coefficients_zero(1);
|
||||
ArrayRef<int> coefficients_one(1);
|
||||
|
||||
coefficients_zero[0] = 0;
|
||||
coefficients_one[0] = 1;
|
||||
|
||||
zero = Ref<GenericGFPoly>(new GenericGFPoly(this, coefficients_zero));
|
||||
one = Ref<GenericGFPoly>(new GenericGFPoly(this, coefficients_one));
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
@ -100,10 +102,10 @@ Ref<GenericGFPoly> GenericGF::buildMonomial(int degree, int coefficient) {
|
||||
if (coefficient == 0) {
|
||||
return zero;
|
||||
}
|
||||
ArrayRef<int> coefficients(new Array<int>(degree + 1));
|
||||
ArrayRef<int> coefficients(degree + 1);
|
||||
coefficients[0] = coefficient;
|
||||
|
||||
return Ref<GenericGFPoly>(new GenericGFPoly(Ref<GenericGF>(this), coefficients));
|
||||
return Ref<GenericGFPoly>(new GenericGFPoly(this, coefficients));
|
||||
}
|
||||
|
||||
int GenericGF::addOrSubtract(int a, int b) {
|
||||
|
@ -31,7 +31,7 @@ using zxing::Ref;
|
||||
// VC++
|
||||
using zxing::GenericGF;
|
||||
|
||||
GenericGFPoly::GenericGFPoly(Ref<GenericGF> field,
|
||||
GenericGFPoly::GenericGFPoly(GenericGF *field,
|
||||
ArrayRef<int> coefficients)
|
||||
: field_(field) {
|
||||
if (coefficients->size() == 0) {
|
||||
@ -96,7 +96,7 @@ int GenericGFPoly::evaluateAt(int a) {
|
||||
}
|
||||
|
||||
Ref<GenericGFPoly> GenericGFPoly::addOrSubtract(Ref<zxing::GenericGFPoly> other) {
|
||||
if (!(field_.object_ == other->field_.object_)) {
|
||||
if (!(field_ == other->field_)) {
|
||||
throw IllegalArgumentException("GenericGFPolys do not have same GenericGF field");
|
||||
}
|
||||
if (isZero()) {
|
||||
@ -130,7 +130,7 @@ Ref<GenericGFPoly> GenericGFPoly::addOrSubtract(Ref<zxing::GenericGFPoly> other)
|
||||
}
|
||||
|
||||
Ref<GenericGFPoly> GenericGFPoly::multiply(Ref<zxing::GenericGFPoly> other) {
|
||||
if (!(field_.object_ == other->field_.object_)) {
|
||||
if (!(field_ == other->field_)) {
|
||||
throw IllegalArgumentException("GenericGFPolys do not have same GenericGF field");
|
||||
}
|
||||
|
||||
@ -186,8 +186,8 @@ Ref<GenericGFPoly> GenericGFPoly::multiplyByMonomial(int degree, int coefficient
|
||||
return Ref<GenericGFPoly>(new GenericGFPoly(field_, product));
|
||||
}
|
||||
|
||||
std::vector<Ref<GenericGFPoly> > GenericGFPoly::divide(Ref<GenericGFPoly> other) {
|
||||
if (!(field_.object_ == other->field_.object_)) {
|
||||
std::vector<Ref<GenericGFPoly>> GenericGFPoly::divide(Ref<GenericGFPoly> other) {
|
||||
if (!(field_ == other->field_)) {
|
||||
throw IllegalArgumentException("GenericGFPolys do not have same GenericGF field");
|
||||
}
|
||||
if (other->isZero()) {
|
||||
|
@ -32,11 +32,11 @@ class GenericGF;
|
||||
|
||||
class GenericGFPoly : public Counted {
|
||||
private:
|
||||
Ref<GenericGF> field_;
|
||||
GenericGF *field_;
|
||||
ArrayRef<int> coefficients_;
|
||||
|
||||
public:
|
||||
GenericGFPoly(Ref<GenericGF> field, ArrayRef<int> coefficients);
|
||||
GenericGFPoly(GenericGF *field, ArrayRef<int> coefficients);
|
||||
ArrayRef<int> getCoefficients();
|
||||
int getDegree();
|
||||
bool isZero();
|
||||
@ -46,7 +46,7 @@ public:
|
||||
Ref<GenericGFPoly> multiply(Ref<GenericGFPoly> other);
|
||||
Ref<GenericGFPoly> multiply(int scalar);
|
||||
Ref<GenericGFPoly> multiplyByMonomial(int degree, int coefficient);
|
||||
std::vector<Ref<GenericGFPoly> > divide(Ref<GenericGFPoly> other);
|
||||
std::vector<Ref<GenericGFPoly>> divide(Ref<GenericGFPoly> other);
|
||||
|
||||
|
||||
};
|
||||
|
@ -38,7 +38,9 @@ void ReedSolomonEncoder::encode(std::vector<int> &toEncode, int ecBytes)
|
||||
if (ecBytes == 0) {
|
||||
throw Exception("No error correction bytes");
|
||||
}
|
||||
int dataBytes = toEncode.size() - ecBytes;
|
||||
//int dataBytes = toEncode.size() - ecBytes;
|
||||
int dataBytes = toEncode.size();// - ecBytes;
|
||||
toEncode.resize(toEncode.size()+ecBytes);
|
||||
if (dataBytes <= 0) {
|
||||
throw Exception("No data bytes provided");
|
||||
}
|
||||
@ -64,8 +66,11 @@ void ReedSolomonEncoder::encode(std::vector<int> &toEncode, int ecBytes)
|
||||
//toEncode.insert(toEncode.begin() + (dataBytes-1) + numZeroCoefficients,
|
||||
// coefficients.array_->values().begin(),
|
||||
// coefficients.array_->values().end());
|
||||
|
||||
//toEncode.resize(toEncode.size() + numZeroCoefficients + coefficients->size());
|
||||
|
||||
for (size_t i = 0; i < coefficients->size(); i++)
|
||||
toEncode[dataBytes + numZeroCoefficients + i] = coefficients[i];
|
||||
toEncode[dataBytes + numZeroCoefficients + i] = coefficients[i];
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user