@@ -129,17 +129,12 @@ public static function validateString(string $string):bool{
129129 public static function decodeSegment (BitBuffer $ bitBuffer , int $ versionNumber ):string {
130130 $ eciCharset = self ::parseValue ($ bitBuffer );
131131 $ nextMode = $ bitBuffer ->read (4 );
132-
133- if ($ nextMode !== Mode::BYTE ){
134- throw new QRCodeDataException (sprintf ('ECI designator followed by invalid mode: "%04b" ' , $ nextMode ));
135- }
136-
137- $ data = Byte::decodeSegment ($ bitBuffer , $ versionNumber );
138- $ encoding = $ eciCharset ->getName ();
132+ $ data = self ::decodeModeSegment ($ nextMode , $ bitBuffer , $ versionNumber );
133+ $ encoding = $ eciCharset ->getName ();
139134
140135 if ($ encoding === null ){
141136 // The spec isn't clear on this mode; see
142- // section 6.4.5: t does not say which encoding to assuming
137+ // section 6.4.5: it does not say which encoding to assuming
143138 // upon decoding. I have seen ISO-8859-1 used as well as
144139 // Shift_JIS -- without anything like an ECI designator to
145140 // give a hint.
@@ -153,4 +148,18 @@ public static function decodeSegment(BitBuffer $bitBuffer, int $versionNumber):s
153148 return mb_convert_encoding ($ data , mb_internal_encoding (), $ encoding );
154149 }
155150
151+ /**
152+ * @throws \chillerlan\QRCode\Data\QRCodeDataException
153+ */
154+ private static function decodeModeSegment (int $ mode , BitBuffer $ bitBuffer , int $ versionNumber ):string {
155+
156+ switch (true ){
157+ case $ mode === Mode::NUMBER : return Number::decodeSegment ($ bitBuffer , $ versionNumber );
158+ case $ mode === Mode::ALPHANUM : return AlphaNum::decodeSegment ($ bitBuffer , $ versionNumber );
159+ case $ mode === Mode::BYTE : return Byte::decodeSegment ($ bitBuffer , $ versionNumber );
160+ }
161+
162+ throw new QRCodeDataException (sprintf ('ECI designator followed by invalid mode: "%04b" ' , $ mode ));
163+ }
164+
156165}
0 commit comments