🔧 estimated bit length was correct, add a safety margin instead

This commit is contained in:
smiley
2024-02-27 15:37:26 +01:00
parent 5371453525
commit da5bdb82c8
3 changed files with 14 additions and 6 deletions
+4 -4
View File
@@ -165,9 +165,9 @@ final class QRData{
// it seems that in some cases the estimated total length is not 100% accurate,
// so we substract 4 bits from the total when not in mixed mode
# if(count($this->dataSegments) <= 1){
# $length -= 4;
# }
if(count($this->dataSegments) <= 1){
$length -= 4;
}
// we've got a match!
// or let's see if there's a higher version number available
@@ -195,7 +195,7 @@ final class QRData{
// guess the version number within the given range
for($version = $this->options->versionMin; $version <= $this->options->versionMax; $version++){
if($total <= $this->maxBitsForEcc[$version]){
if($total <= ($this->maxBitsForEcc[$version] - 4)){
return new Version($version);
}
}
+8 -1
View File
@@ -11,6 +11,7 @@
namespace chillerlan\QRCodeTest\Data;
use chillerlan\QRCode\Common\{EccLevel, MaskPattern, Mode, Version};
use PHPUnit\Framework\ExpectationFailedException;
use chillerlan\QRCode\Data\{QRCodeDataException, QRData, QRDataModeInterface, QRMatrix};
use chillerlan\QRCode\QROptions;
use chillerlan\QRCodeTest\QRMaxLengthTrait;
@@ -187,7 +188,13 @@ abstract class DataInterfaceTestAbstract extends TestCase{
$minimumVersionNumber = $this->QRData->getMinimumVersion()->getVersionNumber();
$this::assertSame($version->getVersionNumber(), $minimumVersionNumber);
try{
$this::assertSame($version->getVersionNumber(), $minimumVersionNumber);
}
catch(ExpectationFailedException $e){
$this::assertSame(($version->getVersionNumber() + 1), $minimumVersionNumber, 'safety margin');
}
// verify the encoded data
$this::assertSame($this->dataMode::DATAMODE, $bitBuffer->read(4));
$this::assertSame($str, $this->dataMode::decodeSegment($bitBuffer, $minimumVersionNumber));
+2 -1
View File
@@ -86,7 +86,8 @@ final class QRDataTest extends TestCase{
$qrData = new QRData($options, [new Byte($str)]);
$this::assertSame(980, $qrData->estimateTotalBitLength());
$this::assertSame(976, $qrData->estimateTotalBitLength());
$this::assertSame(11, $qrData->getMinimumVersion()->getVersionNumber()); // version adjusted to 11
}
}