Skip to content

Commit f1b05e4

Browse files
committed
🚿 extract methods and move to ReedSolomonDecoder
1 parent 10e1162 commit f1b05e4

File tree

2 files changed

+44
-39
lines changed

2 files changed

+44
-39
lines changed

src/Common/ReedSolomonDecoder.php

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,48 @@
3434
*/
3535
final class ReedSolomonDecoder{
3636

37+
/**
38+
* Error-correct and copy data blocks together into a stream of bytes
39+
*/
40+
public function decode(array $dataBlocks):array{
41+
$resultBytes = [];
42+
43+
foreach($dataBlocks as $dataBlock){
44+
[$numDataCodewords, $codewordBytes] = $dataBlock;
45+
46+
$corrected = $this->correctErrors($codewordBytes, $numDataCodewords);
47+
48+
for($i = 0; $i < $numDataCodewords; $i++){
49+
$resultBytes[] = $corrected[$i];
50+
}
51+
}
52+
53+
return $resultBytes;
54+
}
55+
56+
/**
57+
* Given data and error-correction codewords received, possibly corrupted by errors, attempts to
58+
* correct the errors in-place using Reed-Solomon error correction.
59+
*/
60+
private function correctErrors(array $codewordBytes, int $numDataCodewords):array{
61+
// First read into an array of ints
62+
$codewordsInts = [];
63+
64+
foreach($codewordBytes as $codewordByte){
65+
$codewordsInts[] = $codewordByte & 0xFF;
66+
}
67+
68+
$decoded = $this->decodeWords($codewordsInts, (count($codewordBytes) - $numDataCodewords));
69+
70+
// Copy back into array of bytes -- only need to worry about the bytes that were data
71+
// We don't care about errors in the error-correction codewords
72+
for($i = 0; $i < $numDataCodewords; $i++){
73+
$codewordBytes[$i] = $decoded[$i];
74+
}
75+
76+
return $codewordBytes;
77+
}
78+
3779
/**
3880
* Decodes given set of received codewords, which include both data and error-correction
3981
* codewords. Really, this means it uses Reed-Solomon to detect and correct errors, in-place,
@@ -45,7 +87,7 @@ final class ReedSolomonDecoder{
4587
* @return int[]
4688
* @throws \RuntimeException if decoding fails for any reason
4789
*/
48-
public function decode(array $received, int $numEccCodewords):array{
90+
private function decodeWords(array $received, int $numEccCodewords):array{
4991
$poly = new GenericGFPoly($received);
5092
$syndromeCoefficients = [];
5193
$error = false;

src/Decoder/Decoder.php

Lines changed: 1 addition & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -83,21 +83,7 @@ private function decodeMatrix(BitMatrix $bitMatrix):DecoderResult{
8383
}
8484

8585
$this->eccLevel = $this->formatInfo->getErrorCorrectionLevel();
86-
$dataBlocks = $this->getDataBlocks($rawCodewords);
87-
$resultBytes = [];
88-
$resultOffset = 0;
89-
90-
// Error-correct and copy data blocks together into a stream of bytes
91-
foreach($dataBlocks as $dataBlock){
92-
[$numDataCodewords, $codewordBytes] = $dataBlock;
93-
94-
$corrected = $this->correctErrors($codewordBytes, $numDataCodewords);
95-
96-
for($i = 0; $i < $numDataCodewords; $i++){
97-
$resultBytes[$resultOffset++] = $corrected[$i];
98-
}
99-
}
100-
86+
$resultBytes = (new ReedSolomonDecoder)->decode($this->getDataBlocks($rawCodewords));
10187
// Decode the contents of that stream of bytes
10288
return $this->decodeBitStream($resultBytes);
10389
}
@@ -178,29 +164,6 @@ private function getDataBlocks(array $rawCodewords):array{
178164
return $result;
179165
}
180166

181-
/**
182-
* Given data and error-correction codewords received, possibly corrupted by errors, attempts to
183-
* correct the errors in-place using Reed-Solomon error correction.
184-
*/
185-
private function correctErrors(array $codewordBytes, int $numDataCodewords):array{
186-
// First read into an array of ints
187-
$codewordsInts = [];
188-
189-
foreach($codewordBytes as $i => $codewordByte){
190-
$codewordsInts[$i] = $codewordByte & 0xFF;
191-
}
192-
193-
$decoded = (new ReedSolomonDecoder)->decode($codewordsInts, (count($codewordBytes) - $numDataCodewords));
194-
195-
// Copy back into array of bytes -- only need to worry about the bytes that were data
196-
// We don't care about errors in the error-correction codewords
197-
for($i = 0; $i < $numDataCodewords; $i++){
198-
$codewordBytes[$i] = $decoded[$i];
199-
}
200-
201-
return $codewordBytes;
202-
}
203-
204167
/**
205168
* @throws \chillerlan\QRCode\Decoder\QRCodeDecoderException
206169
*/

0 commit comments

Comments
 (0)