Progressing fixes for Qr Encoder. #10

This commit is contained in:
favoritas37 2017-04-19 20:05:44 +03:00
parent e9b7f399a0
commit 295a28ee47
8 changed files with 59 additions and 38 deletions

View File

@ -33,7 +33,7 @@ Ref<GenericGFPoly> ReedSolomonEncoder::buildGenerator(int degree)
return cachedGenerators_.at(degree); // ??? wont this through exception? return cachedGenerators_.at(degree); // ??? wont this through exception?
} }
void ReedSolomonEncoder::encode(std::vector<int> &toEncode, int ecBytes) void ReedSolomonEncoder::encode(std::vector<byte> &toEncode, int ecBytes)
{ {
if (ecBytes == 0) { if (ecBytes == 0) {
throw Exception("No error correction bytes"); throw Exception("No error correction bytes");

View File

@ -4,6 +4,7 @@
#include <zxing/common/reedsolomon/GenericGFPoly.h> #include <zxing/common/reedsolomon/GenericGFPoly.h>
#include <zxing/common/reedsolomon/GenericGF.h> #include <zxing/common/reedsolomon/GenericGF.h>
#include <zxing/common/Array.h> #include <zxing/common/Array.h>
#include <zxing/common/Types.h>
namespace zxing { namespace zxing {
@ -18,7 +19,7 @@ private:
public: public:
ReedSolomonEncoder(Ref<GenericGF> field); ReedSolomonEncoder(Ref<GenericGF> field);
void encode(std::vector<int>& toEncode, int ecBytes); void encode(std::vector<byte> &toEncode, int ecBytes);
}; };
} }

View File

@ -77,7 +77,7 @@ protected:
int numDataBytes, int numDataBytes,
int numRSBlocks); int numRSBlocks);
static ArrayRef<byte> generateECBytes(const std::vector<byte> &dataBytes, int numEcBytesInBlock); static ArrayRef<byte> generateECBytes(std::vector<byte> &dataBytes, int numEcBytesInBlock);
static void appendNumericBytes(const QString& content, BitArray& bits); static void appendNumericBytes(const QString& content, BitArray& bits);

View File

@ -423,20 +423,20 @@ BitArray* Encoder::interleaveWithECBytes(const BitArray& bits,
return result; return result;
} }
ArrayRef<byte> Encoder::generateECBytes(const std::vector<byte>& dataBytes, int numEcBytesInBlock) ArrayRef<byte> Encoder::generateECBytes(std::vector<byte>& dataBytes, int numEcBytesInBlock)
{ {
int numDataBytes = dataBytes.size(); int numDataBytes = dataBytes.size();
std::vector<int> toEncode; // std::vector<int> toEncode(numDataBytes);
toEncode.resize(numDataBytes + numEcBytesInBlock); //toEncode.resize(numDataBytes + numEcBytesInBlock);
for (int i = 0; i < numDataBytes; i++) // for (int i = 0; i < numDataBytes; i++)
toEncode[i] = dataBytes[i]; // toEncode[i] = dataBytes[i];
zxing::ReedSolomonEncoder encoder(GenericGF::QR_CODE_FIELD_256); zxing::ReedSolomonEncoder encoder(GenericGF::QR_CODE_FIELD_256);
encoder.encode(toEncode, numEcBytesInBlock); encoder.encode(dataBytes, numEcBytesInBlock);
ArrayRef<byte> ecBytes(numEcBytesInBlock); ArrayRef<byte> ecBytes(numEcBytesInBlock);
for (int i = 0; i < numEcBytesInBlock; i++) { for (int i = 0; i < numEcBytesInBlock; i++) {
ecBytes[i] = (byte) toEncode[numDataBytes + i]; ecBytes[i] = dataBytes[numDataBytes + i];
} }
return ecBytes; return ecBytes;
} }

View File

@ -84,6 +84,10 @@ protected:
assertEquals(expected_str, actual); assertEquals(expected_str, actual);
} }
// void assertEquals(int expected, int actual) {
// assertEquals(expected, actual);
// }
void assertSame(qrcode::Mode &expected, qrcode::Mode &actual){ void assertSame(qrcode::Mode &expected, qrcode::Mode &actual){
assertEquals(expected, actual); assertEquals(expected, actual);
} }
@ -101,8 +105,8 @@ protected:
} }
void assertDataEquals(const std::string &message, void assertDataEquals(const std::string &message,
const std::vector<int> &expected, const std::vector<byte> &expected,
const std::vector<int> & received) const std::vector<byte> & received)
{ {
if(expected.size() != received.size()) if(expected.size() != received.size())
assertTrue(false); assertTrue(false);
@ -117,8 +121,8 @@ protected:
} }
void assertDataEquals(const std::string &message, void assertDataEquals(const std::string &message,
const std::vector<int> &expected, const std::vector<byte> &expected,
const ArrayRef<int> &received) const ArrayRef<byte> &received)
{ {
if(expected.size() != received->size()) if(expected.size() != received->size())
assertTrue(false); assertTrue(false);
@ -132,6 +136,17 @@ protected:
} }
} }
void assertDataEquals(const std::string &message,
const std::vector<byte> &expected,
const ArrayRef<int> &received)
{
ArrayRef<byte> received_copy(received->size());
for(int i=0; i<received_copy->size(); i++)
received_copy[i] = received[i];
assertDataEquals(message, expected, received_copy);
}
static void initializeRandom(); static void initializeRandom();
static int generateRandomNumber(int range); static int generateRandomNumber(int range);

View File

@ -43,7 +43,7 @@ void ReedSolomonTests::testQRCode()
// testEncodeDecodeRandom(GenericGF::QR_CODE_FIELD_256, 220, 35); // testEncodeDecodeRandom(GenericGF::QR_CODE_FIELD_256, 220, 35);
} }
void ReedSolomonTests::corrupt(std::vector<int> &received, int howMany, int max) void ReedSolomonTests::corrupt(std::vector<byte> &received, int howMany, int max)
{ {
std::vector<bool> corrupted(received.size(), false); std::vector<bool> corrupted(received.size(), false);
for (int j = 0; j < howMany; j++) { for (int j = 0; j < howMany; j++) {
@ -63,9 +63,9 @@ void ReedSolomonTests::testEncodeDecodeRandom(Ref<GenericGF> field, int dataSize
assertTrue(dataSize > 0 && dataSize <= field->getSize() - 3); /*"Invalid data size for " + field, */ assertTrue(dataSize > 0 && dataSize <= field->getSize() - 3); /*"Invalid data size for " + field, */
assertTrue(ecSize > 0 && ecSize + dataSize <= field->getSize()); /*"Invalid ECC size for " + field, */ assertTrue(ecSize > 0 && ecSize + dataSize <= field->getSize()); /*"Invalid ECC size for " + field, */
ReedSolomonEncoder encoder(field); ReedSolomonEncoder encoder(field);
std::vector<int> message;//(dataSize + ecSize); std::vector<byte> message;//(dataSize + ecSize);
std::vector<int> dataWords(dataSize); std::vector<byte> dataWords(dataSize);
std::vector<int> ecWords(ecSize); std::vector<byte> ecWords(ecSize);
initializeRandom(); initializeRandom();
int iterations = field->getSize() > 256 ? 1 : DECODER_RANDOM_TEST_ITERATIONS; int iterations = field->getSize() > 256 ? 1 : DECODER_RANDOM_TEST_ITERATIONS;
for (int i = 0; i < iterations; i++) { for (int i = 0; i < iterations; i++) {
@ -83,20 +83,20 @@ void ReedSolomonTests::testEncodeDecodeRandom(Ref<GenericGF> field, int dataSize
} }
void ReedSolomonTests::testEncodeDecode(Ref<GenericGF> field, void ReedSolomonTests::testEncodeDecode(Ref<GenericGF> field,
const std::vector<int> &dataWords, const std::vector<byte> &dataWords,
const std::vector<int> & ecWords) const std::vector<byte> &ecWords)
{ {
testEncoder(field, dataWords, ecWords); testEncoder(field, dataWords, ecWords);
testDecoder(field, dataWords, ecWords); testDecoder(field, dataWords, ecWords);
} }
void ReedSolomonTests::testEncoder(Ref<GenericGF> field, void ReedSolomonTests::testEncoder(Ref<GenericGF> field,
const std::vector<int> &dataWords, const std::vector<byte> &dataWords,
const std::vector<int> & ecWords) const std::vector<byte> &ecWords)
{ {
ReedSolomonEncoder encoder(field); ReedSolomonEncoder encoder(field);
std::vector<int> messageExpected; std::vector<byte> messageExpected;
std::vector<int> message(dataWords); std::vector<byte> message(dataWords);
messageExpected = dataWords; messageExpected = dataWords;
messageExpected.insert(std::end(messageExpected), std::begin(ecWords), std::end(ecWords)); messageExpected.insert(std::end(messageExpected), std::begin(ecWords), std::end(ecWords));
@ -107,11 +107,11 @@ void ReedSolomonTests::testEncoder(Ref<GenericGF> field,
} }
void ReedSolomonTests::testDecoder(Ref<GenericGF> field, void ReedSolomonTests::testDecoder(Ref<GenericGF> field,
const std::vector<int> &dataWords, const std::vector<byte> &dataWords,
const std::vector<int> & ecWords) { const std::vector<byte> &ecWords) {
ReedSolomonDecoder decoder(field); ReedSolomonDecoder decoder(field);
std::vector<int> message; std::vector<byte> message;
std::vector<int> referenceMessage; std::vector<byte> referenceMessage;
int maxErrors = ecWords.size() / 2; int maxErrors = ecWords.size() / 2;
initializeRandom(); initializeRandom();
@ -133,6 +133,7 @@ void ReedSolomonTests::testDecoder(Ref<GenericGF> field,
ArrayRef<int> messageArrayRef(message.size()); ArrayRef<int> messageArrayRef(message.size());
for(int i=0; i<message.size(); i++) for(int i=0; i<message.size(); i++)
messageArrayRef[i] = message[i]; messageArrayRef[i] = message[i];
try { try {
decoder.decode(messageArrayRef, ecWords.size()); decoder.decode(messageArrayRef, ecWords.size());
} catch(zxing::Exception &e) { } catch(zxing::Exception &e) {

View File

@ -22,17 +22,17 @@ protected:
void testQRCode(); void testQRCode();
private: private:
void corrupt(std::vector<int> &received, int howMany, int max); void corrupt(std::vector<byte> &received, int howMany, int max);
void testEncodeDecodeRandom(Ref<GenericGF> field, int dataSize, int ecSize); void testEncodeDecodeRandom(Ref<GenericGF> field, int dataSize, int ecSize);
void testEncodeDecode(Ref<GenericGF> field, void testEncodeDecode(Ref<GenericGF> field,
const std::vector<int> &dataWords, const std::vector<byte> &dataWords,
const std::vector<int> & ecWords); const std::vector<byte> & ecWords);
void testEncoder(Ref<GenericGF> field, void testEncoder(Ref<GenericGF> field,
const std::vector<int> &dataWords, const std::vector<byte> &dataWords,
const std::vector<int> & ecWords); const std::vector<byte> & ecWords);
void testDecoder(Ref<GenericGF> field, void testDecoder(Ref<GenericGF> field,
const std::vector<int> &dataWords, const std::vector<byte> &dataWords,
const std::vector<int> & ecWords); const std::vector<byte> & ecWords);
}; };
} }

View File

@ -354,15 +354,19 @@ void EncoderTests::testAppend8BitBytes()
void EncoderTests::testGenerateECBytes() void EncoderTests::testGenerateECBytes()
{ {
const byte dataBytes_arr[] = {32, 65, (byte)205, 69, 41, (byte)220, 46, (byte)128, (byte)236}; const byte dataBytes_arr[] = {32, 65, 205, 69, 41, 220, 46, 128, 236};
std::vector<byte> dataBytes (dataBytes_arr, dataBytes_arr + getArrayLength(dataBytes_arr)); std::vector<byte> dataBytes (dataBytes_arr, dataBytes_arr + getArrayLength(dataBytes_arr));
// std::vector<byte> dataBytes(getArrayLength(dataBytes_arr));
// for(int i=0; i<dataBytes.size(); i++)
// dataBytes[i] = dataBytes_arr[i];
ArrayRef<byte> ecBytes = Encoder::generateECBytes(dataBytes, 17); ArrayRef<byte> ecBytes = Encoder::generateECBytes(dataBytes, 17);
const int expected[] = { const byte expected[] = {
42, 159, 74, 221, 244, 169, 239, 150, 138, 70, 237, 85, 224, 96, 74, 219, 61 42, 159, 74, 221, 244, 169, 239, 150, 138, 70, 237, 85, 224, 96, 74, 219, 61
}; };
assertEquals( getArrayLength(expected), ecBytes.count()); assertEquals( getArrayLength(expected), ecBytes.count());
for (int x = 0; x < getArrayLength(expected); x++) { for (int x = 0; x < getArrayLength(expected); x++) {
assertEquals(expected[x], ecBytes[x] & 0xFF); assertEquals(expected[x], ecBytes[x]);
} }
// dataBytes = new byte[] {67, 70, 22, 38, 54, 70, 86, 102, 118, // dataBytes = new byte[] {67, 70, 22, 38, 54, 70, 86, 102, 118,
// (byte)134, (byte)150, (byte)166, (byte)182, (byte)198, (byte)214}; // (byte)134, (byte)150, (byte)166, (byte)182, (byte)198, (byte)214};