mirror of
https://github.com/zxing/zxing.git
synced 2025-02-02 05:41:08 -08:00
Avoid an AIOOBE seen in the wild. A bit of polish.
git-svn-id: https://zxing.googlecode.com/svn/trunk@1763 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
parent
e83f9b4f36
commit
3de06bcf41
|
@ -39,14 +39,14 @@ final class DecodedBitStreamParser {
|
|||
* The C40 Basic Character Set (*'s used for placeholders for the shift values)
|
||||
*/
|
||||
private static final char[] C40_BASIC_SET_CHARS = {
|
||||
'*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
|
||||
'*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
|
||||
};
|
||||
|
||||
private static final char[] C40_SHIFT2_SET_CHARS = {
|
||||
'!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.',
|
||||
'/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_'
|
||||
'!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.',
|
||||
'/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_'
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -61,7 +61,7 @@ final class DecodedBitStreamParser {
|
|||
|
||||
private static final char[] TEXT_SHIFT3_SET_CHARS = {
|
||||
'\'', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '{', '|', '}', '~', (char) 127
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '{', '|', '}', '~', (char) 127
|
||||
};
|
||||
|
||||
private static final int PAD_ENCODE = 0; // Not really an encoding
|
||||
|
@ -124,7 +124,7 @@ final class DecodedBitStreamParser {
|
|||
if (oneByte == 0) {
|
||||
throw FormatException.getFormatInstance();
|
||||
} else if (oneByte <= 128) { // ASCII data (ASCII value + 1)
|
||||
oneByte = upperShift ? (oneByte + 128) : oneByte;
|
||||
oneByte = upperShift ? oneByte + 128 : oneByte;
|
||||
upperShift = false;
|
||||
result.append((char) (oneByte - 1));
|
||||
return ASCII_ENCODE;
|
||||
|
@ -140,15 +140,10 @@ final class DecodedBitStreamParser {
|
|||
return C40_ENCODE;
|
||||
} else if (oneByte == 231) { // Latch to Base 256 encodation
|
||||
return BASE256_ENCODE;
|
||||
} else if (oneByte == 232) { // FNC1
|
||||
} else if (oneByte == 232 || oneByte == 233 || oneByte == 234) {
|
||||
// FNC1, Structured Append, Reader Programming
|
||||
// Ignore these symbols for now
|
||||
//throw ReaderException.getInstance();
|
||||
// Ignore this symbol for now
|
||||
} else if (oneByte == 233) { // Structured Append
|
||||
//throw ReaderException.getInstance();
|
||||
// Ignore this symbol for now
|
||||
} else if (oneByte == 234) { // Reader Programming
|
||||
//throw ReaderException.getInstance();
|
||||
// Ignore this symbol for now
|
||||
} else if (oneByte == 235) { // Upper Shift (shift to Extended ASCII)
|
||||
upperShift = true;
|
||||
} else if (oneByte == 236) { // 05 Macro
|
||||
|
@ -208,13 +203,16 @@ final class DecodedBitStreamParser {
|
|||
case 0:
|
||||
if (cValue < 3) {
|
||||
shift = cValue + 1;
|
||||
} else {
|
||||
} else if (cValue < C40_BASIC_SET_CHARS.length) {
|
||||
char c40char = C40_BASIC_SET_CHARS[cValue];
|
||||
if (upperShift) {
|
||||
result.append((char) (C40_BASIC_SET_CHARS[cValue] + 128));
|
||||
result.append((char) (c40char + 128));
|
||||
upperShift = false;
|
||||
} else {
|
||||
result.append(C40_BASIC_SET_CHARS[cValue]);
|
||||
result.append(c40char);
|
||||
}
|
||||
} else {
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
|
@ -227,12 +225,13 @@ final class DecodedBitStreamParser {
|
|||
shift = 0;
|
||||
break;
|
||||
case 2:
|
||||
if (cValue < 27) {
|
||||
if (cValue < C40_SHIFT2_SET_CHARS.length) {
|
||||
char c40char = C40_SHIFT2_SET_CHARS[cValue];
|
||||
if (upperShift) {
|
||||
result.append((char) (C40_SHIFT2_SET_CHARS[cValue] + 128));
|
||||
result.append((char) (c40char + 128));
|
||||
upperShift = false;
|
||||
} else {
|
||||
result.append(C40_SHIFT2_SET_CHARS[cValue]);
|
||||
result.append(c40char);
|
||||
}
|
||||
} else if (cValue == 27) { // FNC1
|
||||
throw FormatException.getFormatInstance();
|
||||
|
@ -288,13 +287,16 @@ final class DecodedBitStreamParser {
|
|||
case 0:
|
||||
if (cValue < 3) {
|
||||
shift = cValue + 1;
|
||||
} else {
|
||||
} else if (cValue < TEXT_BASIC_SET_CHARS.length) {
|
||||
char textChar = TEXT_BASIC_SET_CHARS[cValue];
|
||||
if (upperShift) {
|
||||
result.append((char) (TEXT_BASIC_SET_CHARS[cValue] + 128));
|
||||
result.append((char) (textChar + 128));
|
||||
upperShift = false;
|
||||
} else {
|
||||
result.append(TEXT_BASIC_SET_CHARS[cValue]);
|
||||
result.append(textChar);
|
||||
}
|
||||
} else {
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
|
@ -308,12 +310,13 @@ final class DecodedBitStreamParser {
|
|||
break;
|
||||
case 2:
|
||||
// Shift 2 for Text is the same encoding as C40
|
||||
if (cValue < 27) {
|
||||
if (cValue < C40_SHIFT2_SET_CHARS.length) {
|
||||
char c40char = C40_SHIFT2_SET_CHARS[cValue];
|
||||
if (upperShift) {
|
||||
result.append((char) (C40_SHIFT2_SET_CHARS[cValue] + 128));
|
||||
result.append((char) (c40char + 128));
|
||||
upperShift = false;
|
||||
} else {
|
||||
result.append(C40_SHIFT2_SET_CHARS[cValue]);
|
||||
result.append(c40char);
|
||||
}
|
||||
} else if (cValue == 27) { // FNC1
|
||||
throw FormatException.getFormatInstance();
|
||||
|
@ -325,13 +328,18 @@ final class DecodedBitStreamParser {
|
|||
shift = 0;
|
||||
break;
|
||||
case 3:
|
||||
if (upperShift) {
|
||||
result.append((char) (TEXT_SHIFT3_SET_CHARS[cValue] + 128));
|
||||
upperShift = false;
|
||||
if (cValue < TEXT_SHIFT3_SET_CHARS.length) {
|
||||
char textChar = TEXT_SHIFT3_SET_CHARS[cValue];
|
||||
if (upperShift) {
|
||||
result.append((char) (textChar + 128));
|
||||
upperShift = false;
|
||||
} else {
|
||||
result.append(textChar);
|
||||
}
|
||||
shift = 0;
|
||||
} else {
|
||||
result.append(TEXT_SHIFT3_SET_CHARS[cValue]);
|
||||
throw FormatException.getFormatInstance();
|
||||
}
|
||||
shift = 0;
|
||||
break;
|
||||
default:
|
||||
throw FormatException.getFormatInstance();
|
||||
|
@ -462,7 +470,7 @@ final class DecodedBitStreamParser {
|
|||
int base256CodewordPosition) {
|
||||
int pseudoRandomNumber = ((149 * base256CodewordPosition) % 255) + 1;
|
||||
int tempVariable = randomizedBase256Codeword - pseudoRandomNumber;
|
||||
return (byte) (tempVariable >= 0 ? tempVariable : (tempVariable + 256));
|
||||
return (byte) (tempVariable >= 0 ? tempVariable : tempVariable + 256);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue