// Creates canonical codewords vector<string> create_codewords(double *freqs, int n_freqs) { typedef pair<Node<int>*, string> NodeCode; vector<string> codewords(n_freqs); queue<NodeCode> q; Node<int>* root = create_tree(freqs, n_freqs); q.push(NodeCode(root, "")); while(!q.empty()) { NodeCode nc = q.front(); q.pop(); if(nc.first->is_leaf()) { codewords[nc.first->data] = nc.second; } else { q.push(NodeCode(nc.first->left, nc.second + "0")); q.push(NodeCode(nc.first->right, nc.second + "1")); } } auto cws = new pair<int, string>[n_freqs]; // max n_freqs for(int i = 0; i < n_freqs; ++i) { cws[i] = pair<int, string>(i, codewords[i]); } vector<string> canonical = canonicalize(cws, n_freqs); delete[] cws; return canonical; }
vector<string> canonicalize(pair<int, string> *cws, int n_codewords) { sort(cws, cws + n_codewords, [](const pair<int, string>& a, const pair<int, string>& b) -> bool { return a.second.size() < b.second.size(); }); int code = 0; for(int i = 0; i < n_codewords; ++i) { boost::dynamic_bitset<> bits(cws[i].second.length(), code); string binary; boost::to_string(bits, binary); cws[i] = pair<int, string>(cws[i].first, binary); if(i < n_codewords - 1) code = (code + 1) << (cws[i + 1].second.length() - cws[i].second.length()); } sort(cws, cws + n_codewords, [](const pair<int, string>& a, const pair<int, string>& b) -> bool { return a.first < b.first; }); vector<string> codewords(n_codewords); for(int i = 0; i < n_codewords; ++i) codewords[i] = cws[i].second; return codewords; }
CBC_CommonDecoderResult* CBC_DataMatrixDecoder::Decode( CBC_CommonBitMatrix* bits, int32_t& e) { CBC_DataMatrixBitMatrixParser parser; parser.Init(bits, e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); CBC_DataMatrixVersion* version = parser.GetVersion(); CFX_ByteArray* byteTemp = parser.ReadCodewords(e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); CBC_AutoPtr<CFX_ByteArray> codewords(byteTemp); CFX_PtrArray* dataBlocks = CBC_DataMatrixDataBlock::GetDataBlocks(codewords.get(), version, e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); int32_t dataBlocksCount = dataBlocks->GetSize(); int32_t totalBytes = 0; int32_t i, j; for (i = 0; i < dataBlocksCount; i++) { totalBytes += ((CBC_DataMatrixDataBlock*)(*dataBlocks)[i])->GetNumDataCodewords(); } CFX_ByteArray resultBytes; resultBytes.SetSize(totalBytes); for (j = 0; j < dataBlocksCount; j++) { CFX_ByteArray* codewordBytes = ((CBC_DataMatrixDataBlock*)(*dataBlocks)[j])->GetCodewords(); int32_t numDataCodewords = ((CBC_DataMatrixDataBlock*)(*dataBlocks)[j])->GetNumDataCodewords(); CorrectErrors(*codewordBytes, numDataCodewords, e); if (e != BCExceptionNO) { for (int32_t i = 0; i < dataBlocks->GetSize(); i++) { delete (CBC_DataMatrixDataBlock*)(*dataBlocks)[i]; } delete dataBlocks; dataBlocks = NULL; return NULL; } int32_t i; for (i = 0; i < numDataCodewords; i++) { resultBytes[i * dataBlocksCount + j] = (*codewordBytes)[i]; } } for (i = 0; i < (dataBlocks->GetSize()); i++) { delete (CBC_DataMatrixDataBlock*)(*dataBlocks)[i]; } delete dataBlocks; dataBlocks = NULL; CBC_CommonDecoderResult* resultR = CBC_DataMatrixDecodedBitStreamParser::Decode(resultBytes, e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); return resultR; }
CBC_CommonDecoderResult* CBC_QRCoderDecoder::Decode(CBC_CommonBitMatrix* bits, int32_t byteModeDecode, int32_t& e) { CBC_QRBitMatrixParser parser; parser.Init(bits, e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); CBC_QRCoderVersion* version = parser.ReadVersion(e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); CBC_QRCoderFormatInformation* temp = parser.ReadFormatInformation(e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); CBC_QRCoderErrorCorrectionLevel* ecLevel = temp->GetErrorCorrectionLevel(); CFX_ByteArray* ba = parser.ReadCodewords(e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); CBC_AutoPtr<CFX_ByteArray> codewords(ba); CFX_PtrArray* dataBlocks = CBC_QRDataBlock::GetDataBlocks(codewords.get(), version, ecLevel, e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); int32_t totalBytes = 0; for (int32_t i = 0; i < dataBlocks->GetSize(); i++) { totalBytes += ((CBC_QRDataBlock*)((*dataBlocks)[i]))->GetNumDataCodewords(); } CFX_ByteArray resultBytes; for (int32_t j = 0; j < dataBlocks->GetSize(); j++) { CBC_QRDataBlock* dataBlock = (CBC_QRDataBlock*)((*dataBlocks)[j]); CFX_ByteArray* codewordBytes = dataBlock->GetCodewords(); int32_t numDataCodewords = dataBlock->GetNumDataCodewords(); CorrectErrors(codewordBytes, numDataCodewords, e); if (e != BCExceptionNO) { for (int32_t k = 0; k < dataBlocks->GetSize(); k++) { delete (CBC_QRDataBlock*)(*dataBlocks)[k]; } dataBlocks->RemoveAll(); delete dataBlocks; dataBlocks = NULL; return NULL; } for (int32_t i = 0; i < numDataCodewords; i++) { resultBytes.Add((*codewordBytes)[i]); } } for (int32_t k = 0; k < dataBlocks->GetSize(); k++) { delete (CBC_QRDataBlock*)(*dataBlocks)[k]; } dataBlocks->RemoveAll(); delete dataBlocks; dataBlocks = NULL; CBC_CommonDecoderResult* cdr = CBC_QRDecodedBitStreamParser::Decode( &resultBytes, version, ecLevel, byteModeDecode, e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); return cdr; }