|
|
<?php |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace Zxing\Qrcode\Decoder; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Mode |
|
|
{ |
|
|
public static $TERMINATOR; |
|
|
public static $NUMERIC; |
|
|
public static $ALPHANUMERIC; |
|
|
public static $STRUCTURED_APPEND; |
|
|
public static $BYTE; |
|
|
public static $ECI; |
|
|
public static $KANJI; |
|
|
public static $FNC1_FIRST_POSITION; |
|
|
public static $FNC1_SECOND_POSITION; |
|
|
public static $HANZI; |
|
|
|
|
|
private $characterCountBitsForVersions; |
|
|
private $bits; |
|
|
|
|
|
public function __construct($characterCountBitsForVersions, $bits) |
|
|
{ |
|
|
$this->characterCountBitsForVersions = $characterCountBitsForVersions; |
|
|
$this->bits = $bits; |
|
|
} |
|
|
|
|
|
public static function Init() |
|
|
{ |
|
|
|
|
|
|
|
|
self::$TERMINATOR = new Mode([0, 0, 0], 0x00); |
|
|
self::$NUMERIC = new Mode([10, 12, 14], 0x01); |
|
|
self::$ALPHANUMERIC = new Mode([9, 11, 13], 0x02); |
|
|
self::$STRUCTURED_APPEND = new Mode([0, 0, 0], 0x03); |
|
|
self::$BYTE = new Mode([8, 16, 16], 0x04); |
|
|
self::$ECI = new Mode([0, 0, 0], 0x07); |
|
|
self::$KANJI = new Mode([8, 10, 12], 0x08); |
|
|
self::$FNC1_FIRST_POSITION = new Mode([0, 0, 0], 0x05); |
|
|
self::$FNC1_SECOND_POSITION = new Mode([0, 0, 0], 0x09); |
|
|
|
|
|
self::$HANZI = new Mode([8, 10, 12], 0x0D); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function forBits($bits) |
|
|
{ |
|
|
switch ($bits) { |
|
|
case 0x0: |
|
|
return self::$TERMINATOR; |
|
|
case 0x1: |
|
|
return self::$NUMERIC; |
|
|
case 0x2: |
|
|
return self::$ALPHANUMERIC; |
|
|
case 0x3: |
|
|
return self::$STRUCTURED_APPEND; |
|
|
case 0x4: |
|
|
return self::$BYTE; |
|
|
case 0x5: |
|
|
return self::$FNC1_FIRST_POSITION; |
|
|
case 0x7: |
|
|
return self::$ECI; |
|
|
case 0x8: |
|
|
return self::$KANJI; |
|
|
case 0x9: |
|
|
return self::$FNC1_SECOND_POSITION; |
|
|
case 0xD: |
|
|
|
|
|
return self::$HANZI; |
|
|
default: |
|
|
throw new \InvalidArgumentException(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getCharacterCountBits($version) |
|
|
{ |
|
|
$number = $version->getVersionNumber(); |
|
|
$offset = 0; |
|
|
if ($number <= 9) { |
|
|
$offset = 0; |
|
|
} else if ($number <= 26) { |
|
|
$offset = 1; |
|
|
} else { |
|
|
$offset = 2; |
|
|
} |
|
|
|
|
|
return $this->characterCountBitsForVersions[$offset]; |
|
|
} |
|
|
|
|
|
public function getBits() |
|
|
{ |
|
|
return $this->bits; |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
Mode::Init(); |
|
|
|