Issue 1332 fix EDIFACT decoding

git-svn-id: https://zxing.googlecode.com/svn/trunk@2387 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
srowen 2012-08-10 10:04:19 +00:00
parent 0b3132e68f
commit 9add6f3992
2 changed files with 17 additions and 10 deletions

View file

@ -39,6 +39,13 @@ public final class BitSource {
this.bytes = bytes; this.bytes = bytes;
} }
/**
* @return index of next bit in current byte which would be read by the next call to {@link #readBits(int)}.
*/
public int getBitOffset() {
return bitOffset;
}
/** /**
* @return index of next byte in input byte array which would be read by the next call to {@link #readBits(int)}. * @return index of next byte in input byte array which would be read by the next call to {@link #readBits(int)}.
*/ */

View file

@ -413,7 +413,6 @@ final class DecodedBitStreamParser {
* See ISO 16022:2006, 5.2.8 and Annex C Table C.3 * See ISO 16022:2006, 5.2.8 and Annex C Table C.3
*/ */
private static void decodeEdifactSegment(BitSource bits, StringBuilder result) { private static void decodeEdifactSegment(BitSource bits, StringBuilder result) {
boolean unlatch = false;
do { do {
// If there is only two or less bytes left then it will be encoded as ASCII // If there is only two or less bytes left then it will be encoded as ASCII
if (bits.available() <= 16) { if (bits.available() <= 16) {
@ -425,19 +424,20 @@ final class DecodedBitStreamParser {
// Check for the unlatch character // Check for the unlatch character
if (edifactValue == 0x1F) { // 011111 if (edifactValue == 0x1F) { // 011111
unlatch = true; // Read rest of byte, which should be 0, and stop
// If we encounter the unlatch code then continue reading because the Codeword triple int bitsLeft = 8 - bits.getBitOffset();
// is padded with 0's if (bitsLeft != 8) {
bits.readBits(bitsLeft);
}
return;
} }
if (!unlatch) { if ((edifactValue & 0x20) == 0) { // no 1 in the leading (6th) bit
if ((edifactValue & 0x20) == 0) { // no 1 in the leading (6th) bit edifactValue |= 0x40; // Add a leading 01 to the 6 bit binary value
edifactValue |= 0x40; // Add a leading 01 to the 6 bit binary value
}
result.append((char) edifactValue);
} }
result.append((char) edifactValue);
} }
} while (!unlatch && bits.available() > 0); } while (bits.available() > 0);
} }
/** /**