Beispiel #1
0
  /**
   * Decodes a Data Matrix Code represented as a {@link BitMatrix}. A 1 or "true" is taken to mean a
   * black module.
   *
   * @param bits booleans representing white/black Data Matrix Code modules
   * @return text and bytes encoded within the Data Matrix Code
   * @throws FormatException if the Data Matrix Code cannot be decoded
   * @throws ChecksumException if error correction fails
   */
  public DecoderResult decode(BitMatrix bits) throws FormatException, ChecksumException {

    // Construct a parser and read version, error-correction level
    BitMatrixParser parser = new BitMatrixParser(bits);
    Version version = parser.getVersion();

    // Read codewords
    byte[] codewords = parser.readCodewords();
    // Separate into data blocks
    DataBlock[] dataBlocks = DataBlock.getDataBlocks(codewords, version);

    int dataBlocksCount = dataBlocks.length;

    // Count total number of data bytes
    int totalBytes = 0;
    for (int i = 0; i < dataBlocksCount; i++) {
      totalBytes += dataBlocks[i].getNumDataCodewords();
    }
    byte[] resultBytes = new byte[totalBytes];

    // Error-correct and copy data blocks together into a stream of bytes
    for (int j = 0; j < dataBlocksCount; j++) {
      DataBlock dataBlock = dataBlocks[j];
      byte[] codewordBytes = dataBlock.getCodewords();
      int numDataCodewords = dataBlock.getNumDataCodewords();
      correctErrors(codewordBytes, numDataCodewords);
      for (int i = 0; i < numDataCodewords; i++) {
        // De-interlace data blocks.
        resultBytes[i * dataBlocksCount + j] = codewordBytes[i];
      }
    }

    // Decode the contents of that stream of bytes
    return DecodedBitStreamParser.decode(resultBytes);
  }
Beispiel #2
0
  private DecoderResult decode(BitMatrixParser parser, Map<DecodeHintType, ?> hints)
      throws FormatException, ChecksumException {
    Version version = parser.readVersion();
    ErrorCorrectionLevel ecLevel = parser.readFormatInformation().getErrorCorrectionLevel();

    // Read codewords
    byte[] codewords = parser.readCodewords();
    // Separate into data blocks
    DataBlock[] dataBlocks = DataBlock.getDataBlocks(codewords, version, ecLevel);

    // Count total number of data bytes
    int totalBytes = 0;
    for (DataBlock dataBlock : dataBlocks) {
      totalBytes += dataBlock.getNumDataCodewords();
    }
    byte[] resultBytes = new byte[totalBytes];
    int resultOffset = 0;

    // Error-correct and copy data blocks together into a stream of bytes
    for (DataBlock dataBlock : dataBlocks) {
      byte[] codewordBytes = dataBlock.getCodewords();
      int numDataCodewords = dataBlock.getNumDataCodewords();
      correctErrors(codewordBytes, numDataCodewords);
      for (int i = 0; i < numDataCodewords; i++) {
        resultBytes[resultOffset++] = codewordBytes[i];
      }
    }

    // Decode the contents of that stream of bytes
    return DecodedBitStreamParser.decode(resultBytes, version, ecLevel, hints);
  }
Beispiel #3
0
  /**
   * 각 slot에 저장되어 있는 block들을 검색하여 key에 해당하는 값을 가져온다.
   *
   * @param key
   * @return null if not found
   */
  public /* synchronized */ D find(K key) {
    int keyIndex = keys.indexOf(key);
    if (keyIndex < 0) return null;

    int blkIndex = keyIndex / blockSize;
    DataBlock<K, D> blk = slots.getSlot(blkIndex);

    // load data block into data space ; 해당 블럭이 없으면 DB에서 로드한다.
    if (blk == null) {
      if (keyIndex < 0) {
        return null;
      }

      // 범위지정
      int from = keyIndex - (keyIndex % blockSize);
      int to = from + blockSize - 1;
      if (to >= keys.size()) {
        to = keys.size() - 1; // 최대 범위를 넘어가는 것을 제한
      }
      blk = reader.read(keys, from, to);
      slots.feedNewSlot(blkIndex, blk);
    }
    return blk.find(key);
  }