Esempio n. 1
0
  /** 位置合わせパターンを設定 */
  private void setupPositionAdjustPattern() {

    int[] pos = QRUtil.getPatternPosition(typeNumber);

    for (int i = 0; i < pos.length; i++) {

      for (int j = 0; j < pos.length; j++) {

        int row = pos[i];
        int col = pos[j];

        if (modules[row][col] != null) {
          continue;
        }

        for (int r = -2; r <= 2; r++) {

          for (int c = -2; c <= 2; c++) {

            if (r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0)) {
              modules[row + r][col + c] = Boolean.valueOf(true);
            } else {
              modules[row + r][col + c] = Boolean.valueOf(false);
            }
          }
        }
      }
    }
  }
Esempio n. 2
0
 public int getLength() {
   try {
     return getData().getBytes(QRUtil.getJISEncoding()).length;
   } catch (UnsupportedEncodingException e) {
     throw new RuntimeException(e.getMessage());
   }
 }
Esempio n. 3
0
  /**
   * 最小の型番となる QRCode を作成する。
   *
   * @param data データ
   * @param errorCorrectLevel 誤り訂正レベル
   */
  public static QRCode getMinimumQRCode(String data, int errorCorrectLevel) {

    int mode = QRUtil.getMode(data);

    QRCode qr = new QRCode();
    qr.setErrorCorrectLevel(errorCorrectLevel);
    qr.addData(data, mode);

    int length = qr.getData(0).getLength();

    for (int typeNumber = 1; typeNumber <= 10; typeNumber++) {
      if (length <= QRUtil.getMaxLength(typeNumber, mode, errorCorrectLevel)) {
        qr.setTypeNumber(typeNumber);
        break;
      }
    }

    qr.make();

    return qr;
  }
Esempio n. 4
0
  /** 型番を設定 */
  private void setupTypeNumber(boolean test) {

    int bits = QRUtil.getBCHTypeNumber(typeNumber);

    for (int i = 0; i < 18; i++) {
      Boolean mod = Boolean.valueOf(!test && ((bits >> i) & 1) == 1);
      modules[i / 3][i % 3 + moduleCount - 8 - 3] = mod;
    }

    for (int i = 0; i < 18; i++) {
      Boolean mod = Boolean.valueOf(!test && ((bits >> i) & 1) == 1);
      modules[i % 3 + moduleCount - 8 - 3][i / 3] = mod;
    }
  }
Esempio n. 5
0
  public void write(BitBuffer buffer) {

    try {

      byte[] data = getData().getBytes(QRUtil.getJISEncoding());

      for (int i = 0; i < data.length; i++) {
        buffer.put(data[i], 8);
      }

    } catch (UnsupportedEncodingException e) {
      throw new RuntimeException(e.getMessage());
    }
  }
Esempio n. 6
0
  private void mapData(byte[] data, int maskPattern) {

    int inc = -1;
    int row = moduleCount - 1;
    int bitIndex = 7;
    int byteIndex = 0;

    for (int col = moduleCount - 1; col > 0; col -= 2) {

      if (col == 6) col--;

      while (true) {

        for (int c = 0; c < 2; c++) {

          if (modules[row][col - c] == null) {

            boolean dark = false;

            if (byteIndex < data.length) {
              dark = (((data[byteIndex] >>> bitIndex) & 1) == 1);
            }

            boolean mask = QRUtil.getMask(maskPattern, row, col - c);

            if (mask) {
              dark = !dark;
            }

            modules[row][col - c] = Boolean.valueOf(dark);
            bitIndex--;

            if (bitIndex == -1) {
              byteIndex++;
              bitIndex = 7;
            }
          }
        }

        row += inc;

        if (row < 0 || moduleCount <= row) {
          row -= inc;
          inc = -inc;
          break;
        }
      }
    }
  }
Esempio n. 7
0
  private int getBestMaskPattern() {

    int minLostPoint = 0;
    int pattern = 0;

    for (int i = 0; i < 8; i++) {

      make(true, i);

      int lostPoint = QRUtil.getLostPoint(this);

      if (i == 0 || minLostPoint > lostPoint) {
        minLostPoint = lostPoint;
        pattern = i;
      }
    }

    return pattern;
  }
Esempio n. 8
0
  /** 形式情報を設定 */
  private void setupTypeInfo(boolean test, int maskPattern) {

    int data = (errorCorrectLevel << 3) | maskPattern;
    int bits = QRUtil.getBCHTypeInfo(data);

    // 縦方向
    for (int i = 0; i < 15; i++) {

      Boolean mod = Boolean.valueOf(!test && ((bits >> i) & 1) == 1);

      if (i < 6) {
        modules[i][8] = mod;
      } else if (i < 8) {
        modules[i + 1][8] = mod;
      } else {
        modules[moduleCount - 15 + i][8] = mod;
      }
    }

    // 横方向
    for (int i = 0; i < 15; i++) {

      Boolean mod = Boolean.valueOf(!test && ((bits >> i) & 1) == 1);

      if (i < 8) {
        modules[8][moduleCount - i - 1] = mod;
      } else if (i < 9) {
        modules[8][15 - i - 1 + 1] = mod;
      } else {
        modules[8][15 - i - 1] = mod;
      }
    }

    // 固定
    modules[moduleCount - 8][8] = Boolean.valueOf(!test);
  }
Esempio n. 9
0
 /**
  * データを追加する。
  *
  * @param data データ
  */
 public void addData(String data) {
   addData(data, QRUtil.getMode(data));
 }
Esempio n. 10
0
  private static byte[] createBytes(BitBuffer buffer, RSBlock[] rsBlocks) {

    int offset = 0;

    int maxDcCount = 0;
    int maxEcCount = 0;

    int[][] dcdata = new int[rsBlocks.length][];
    int[][] ecdata = new int[rsBlocks.length][];

    for (int r = 0; r < rsBlocks.length; r++) {

      int dcCount = rsBlocks[r].getDataCount();
      int ecCount = rsBlocks[r].getTotalCount() - dcCount;

      maxDcCount = Math.max(maxDcCount, dcCount);
      maxEcCount = Math.max(maxEcCount, ecCount);

      dcdata[r] = new int[dcCount];
      for (int i = 0; i < dcdata[r].length; i++) {
        dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset];
      }
      offset += dcCount;

      Polynomial rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
      Polynomial rawPoly = new Polynomial(dcdata[r], rsPoly.getLength() - 1);

      Polynomial modPoly = rawPoly.mod(rsPoly);
      ecdata[r] = new int[rsPoly.getLength() - 1];
      for (int i = 0; i < ecdata[r].length; i++) {
        int modIndex = i + modPoly.getLength() - ecdata[r].length;
        ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0;
      }
    }

    int totalCodeCount = 0;
    for (int i = 0; i < rsBlocks.length; i++) {
      totalCodeCount += rsBlocks[i].getTotalCount();
    }

    byte[] data = new byte[totalCodeCount];

    int index = 0;

    for (int i = 0; i < maxDcCount; i++) {
      for (int r = 0; r < rsBlocks.length; r++) {
        if (i < dcdata[r].length) {
          data[index++] = (byte) dcdata[r][i];
        }
      }
    }

    for (int i = 0; i < maxEcCount; i++) {
      for (int r = 0; r < rsBlocks.length; r++) {
        if (i < ecdata[r].length) {
          data[index++] = (byte) ecdata[r][i];
        }
      }
    }

    return data;
  }