@@ -129,17 +129,12 @@ public static function validateString(string $string):bool{
129
129
public static function decodeSegment (BitBuffer $ bitBuffer , int $ versionNumber ):string {
130
130
$ eciCharset = self ::parseValue ($ bitBuffer );
131
131
$ 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 ();
139
134
140
135
if ($ encoding === null ){
141
136
// 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
143
138
// upon decoding. I have seen ISO-8859-1 used as well as
144
139
// Shift_JIS -- without anything like an ECI designator to
145
140
// give a hint.
@@ -153,4 +148,18 @@ public static function decodeSegment(BitBuffer $bitBuffer, int $versionNumber):s
153
148
return mb_convert_encoding ($ data , mb_internal_encoding (), $ encoding );
154
149
}
155
150
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
+
156
165
}
0 commit comments