This commit is contained in:
Sean Owen 2021-09-11 18:03:19 -05:00
parent f5ef61ec13
commit c6a4e0fa97
3 changed files with 23 additions and 26 deletions

View file

@ -33,19 +33,20 @@ final class BinaryShiftToken extends Token {
@Override @Override
public void appendTo(BitArray bitArray, byte[] text) { public void appendTo(BitArray bitArray, byte[] text) {
for (int i = 0; i < binaryShiftByteCount; i++) { int bsbc = binaryShiftByteCount;
if (i == 0 || (i == 31 && binaryShiftByteCount <= 62)) { for (int i = 0; i < bsbc; i++) {
if (i == 0 || (i == 31 && bsbc <= 62)) {
// We need a header before the first character, and before // We need a header before the first character, and before
// character 31 when the total byte code is <= 62 // character 31 when the total byte code is <= 62
bitArray.appendBits(31, 5); // BINARY_SHIFT bitArray.appendBits(31, 5); // BINARY_SHIFT
if (binaryShiftByteCount > 62) { if (bsbc > 62) {
bitArray.appendBits(binaryShiftByteCount - 31, 16); bitArray.appendBits(bsbc - 31, 16);
} else if (i == 0) { } else if (i == 0) {
// 1 <= binaryShiftByteCode <= 62 // 1 <= binaryShiftByteCode <= 62
bitArray.appendBits(Math.min(binaryShiftByteCount, 31), 5); bitArray.appendBits(Math.min(bsbc, 31), 5);
} else { } else {
// 32 <= binaryShiftCount <= 62 and i == 31 // 32 <= binaryShiftCount <= 62 and i == 31
bitArray.appendBits(binaryShiftByteCount - 31, 5); bitArray.appendBits(bsbc - 31, 5);
} }
} }
bitArray.appendBits(text[binaryShiftStart + i], 8); bitArray.appendBits(text[binaryShiftStart + i], 8);

View file

@ -18,8 +18,8 @@ package com.google.zxing.aztec.encoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Deque; import java.util.ArrayList;
import java.util.LinkedList; import java.util.List;
import com.google.zxing.common.BitArray; import com.google.zxing.common.BitArray;
@ -166,18 +166,15 @@ final class State {
} }
BitArray toBitArray(byte[] text) { BitArray toBitArray(byte[] text) {
// Reverse the tokens, so that they are in the order that they should List<Token> symbols = new ArrayList<>();
// be output
Deque<Token> symbols = new LinkedList<>();
for (Token token = endBinaryShift(text.length).token; token != null; token = token.getPrevious()) { for (Token token = endBinaryShift(text.length).token; token != null; token = token.getPrevious()) {
symbols.addFirst(token); symbols.add(token);
} }
BitArray bitArray = new BitArray(); BitArray bitArray = new BitArray();
// Add each token to the result. // Add each token to the result in forward order
for (Token symbol : symbols) { for (int i = symbols.size() - 1; i >= 0; i--) {
symbol.appendTo(bitArray, text); symbols.get(i).appendTo(bitArray, text);
} }
//assert bitArray.getSize() == this.bitCount;
return bitArray; return bitArray;
} }

View file

@ -233,10 +233,15 @@ public final class BitArray implements Cloneable {
if (numBits < 0 || numBits > 32) { if (numBits < 0 || numBits > 32) {
throw new IllegalArgumentException("Num bits must be between 0 and 32"); throw new IllegalArgumentException("Num bits must be between 0 and 32");
} }
ensureCapacity(size + numBits); int nextSize = size;
for (int numBitsLeft = numBits; numBitsLeft > 0; numBitsLeft--) { ensureCapacity(nextSize + numBits);
appendBit(((value >> (numBitsLeft - 1)) & 0x01) == 1); for (int numBitsLeft = numBits - 1; numBitsLeft >= 0; numBitsLeft--) {
if ((value & (1 << numBitsLeft)) != 0) {
bits[nextSize / 32] |= 1 << (nextSize & 0x1F);
}
nextSize++;
} }
size = nextSize;
} }
public void appendBitArray(BitArray other) { public void appendBitArray(BitArray other) {
@ -296,13 +301,7 @@ public final class BitArray implements Cloneable {
int len = (size - 1) / 32; int len = (size - 1) / 32;
int oldBitsLen = len + 1; int oldBitsLen = len + 1;
for (int i = 0; i < oldBitsLen; i++) { for (int i = 0; i < oldBitsLen; i++) {
long x = bits[i]; newBits[len - i] = Integer.reverse(bits[i]);
x = ((x >> 1) & 0x55555555L) | ((x & 0x55555555L) << 1);
x = ((x >> 2) & 0x33333333L) | ((x & 0x33333333L) << 2);
x = ((x >> 4) & 0x0f0f0f0fL) | ((x & 0x0f0f0f0fL) << 4);
x = ((x >> 8) & 0x00ff00ffL) | ((x & 0x00ff00ffL) << 8);
x = ((x >> 16) & 0x0000ffffL) | ((x & 0x0000ffffL) << 16);
newBits[len - i] = (int) x;
} }
// now correct the int's if the bit size isn't a multiple of 32 // now correct the int's if the bit size isn't a multiple of 32
if (size != oldBitsLen * 32) { if (size != oldBitsLen * 32) {