From b0f9f99273229dcb47e405779f92d8b6027e20e7 Mon Sep 17 00:00:00 2001 From: jaemi Date: Sat, 6 Jun 2020 16:48:01 +0900 Subject: [PATCH 01/23] Refactoring operation name : rename Refactoring object : QrSegment.java Reason : BitBuffer bb is too simple to express meaning bitBuffer. So, rename bb to bitBuffer --- .../java/io/nayuki/qrcodegen/QrSegment.java | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index f416200..170d9d2 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -58,10 +58,10 @@ public final class QrSegment { */ public static QrSegment makeBytes(byte[] data) { Objects.requireNonNull(data); - BitBuffer bb = new BitBuffer(); + BitBuffer bitBuffer = new BitBuffer(); for (byte b : data) - bb.appendBits(b & 0xFF, 8); - return new QrSegment(Mode.BYTE, data.length, bb); + bitBuffer.appendBits(b & 0xFF, 8); + return new QrSegment(Mode.BYTE, data.length, bitBuffer); } @@ -77,13 +77,13 @@ public final class QrSegment { if (!NUMERIC_REGEX.matcher(digits).matches()) throw new IllegalArgumentException("String contains non-numeric characters"); - BitBuffer bb = new BitBuffer(); + BitBuffer bitBuffer = new BitBuffer(); for (int i = 0; i < digits.length(); ) { // Consume up to 3 digits per iteration int n = Math.min(digits.length() - i, 3); - bb.appendBits(Integer.parseInt(digits.substring(i, i + n)), n * 3 + 1); + bitBuffer.appendBits(Integer.parseInt(digits.substring(i, i + n)), n * 3 + 1); i += n; } - return new QrSegment(Mode.NUMERIC, digits.length(), bb); + return new QrSegment(Mode.NUMERIC, digits.length(), bitBuffer); } @@ -101,16 +101,16 @@ public final class QrSegment { if (!ALPHANUMERIC_REGEX.matcher(text).matches()) throw new IllegalArgumentException("String contains unencodable characters in alphanumeric mode"); - BitBuffer bb = new BitBuffer(); + BitBuffer bitBuffer = new BitBuffer(); int i; for (i = 0; i <= text.length() - 2; i += 2) { // Process groups of 2 int temp = ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45; temp += ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1)); - bb.appendBits(temp, 11); + bitBuffer.appendBits(temp, 11); } if (i < text.length()) // 1 character remaining - bb.appendBits(ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6); - return new QrSegment(Mode.ALPHANUMERIC, text.length(), bb); + bitBuffer.appendBits(ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6); + return new QrSegment(Mode.ALPHANUMERIC, text.length(), bitBuffer); } @@ -145,20 +145,20 @@ public final class QrSegment { * @throws IllegalArgumentException if the value is outside the range [0, 106) */ public static QrSegment makeEci(int assignVal) { - BitBuffer bb = new BitBuffer(); + BitBuffer bitBuffer = new BitBuffer(); if (assignVal < 0) throw new IllegalArgumentException("ECI assignment value out of range"); else if (assignVal < (1 << 7)) - bb.appendBits(assignVal, 8); + bitBuffer.appendBits(assignVal, 8); else if (assignVal < (1 << 14)) { - bb.appendBits(2, 2); - bb.appendBits(assignVal, 14); + bitBuffer.appendBits(2, 2); + bitBuffer.appendBits(assignVal, 14); } else if (assignVal < 1_000_000) { - bb.appendBits(6, 3); - bb.appendBits(assignVal, 21); + bitBuffer.appendBits(6, 3); + bitBuffer.appendBits(assignVal, 21); } else throw new IllegalArgumentException("ECI assignment value out of range"); - return new QrSegment(Mode.ECI, 0, bb); + return new QrSegment(Mode.ECI, 0, bitBuffer); } From 42ef659ef3415d23ef47c686e33794e9c98bacc1 Mon Sep 17 00:00:00 2001 From: jaemi Date: Sat, 6 Jun 2020 17:10:53 +0900 Subject: [PATCH 02/23] hello --- .../java/io/nayuki/qrcodegen/QrSegment.java | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index 170d9d2..f416200 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -58,10 +58,10 @@ public final class QrSegment { */ public static QrSegment makeBytes(byte[] data) { Objects.requireNonNull(data); - BitBuffer bitBuffer = new BitBuffer(); + BitBuffer bb = new BitBuffer(); for (byte b : data) - bitBuffer.appendBits(b & 0xFF, 8); - return new QrSegment(Mode.BYTE, data.length, bitBuffer); + bb.appendBits(b & 0xFF, 8); + return new QrSegment(Mode.BYTE, data.length, bb); } @@ -77,13 +77,13 @@ public final class QrSegment { if (!NUMERIC_REGEX.matcher(digits).matches()) throw new IllegalArgumentException("String contains non-numeric characters"); - BitBuffer bitBuffer = new BitBuffer(); + BitBuffer bb = new BitBuffer(); for (int i = 0; i < digits.length(); ) { // Consume up to 3 digits per iteration int n = Math.min(digits.length() - i, 3); - bitBuffer.appendBits(Integer.parseInt(digits.substring(i, i + n)), n * 3 + 1); + bb.appendBits(Integer.parseInt(digits.substring(i, i + n)), n * 3 + 1); i += n; } - return new QrSegment(Mode.NUMERIC, digits.length(), bitBuffer); + return new QrSegment(Mode.NUMERIC, digits.length(), bb); } @@ -101,16 +101,16 @@ public final class QrSegment { if (!ALPHANUMERIC_REGEX.matcher(text).matches()) throw new IllegalArgumentException("String contains unencodable characters in alphanumeric mode"); - BitBuffer bitBuffer = new BitBuffer(); + BitBuffer bb = new BitBuffer(); int i; for (i = 0; i <= text.length() - 2; i += 2) { // Process groups of 2 int temp = ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45; temp += ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1)); - bitBuffer.appendBits(temp, 11); + bb.appendBits(temp, 11); } if (i < text.length()) // 1 character remaining - bitBuffer.appendBits(ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6); - return new QrSegment(Mode.ALPHANUMERIC, text.length(), bitBuffer); + bb.appendBits(ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6); + return new QrSegment(Mode.ALPHANUMERIC, text.length(), bb); } @@ -145,20 +145,20 @@ public final class QrSegment { * @throws IllegalArgumentException if the value is outside the range [0, 106) */ public static QrSegment makeEci(int assignVal) { - BitBuffer bitBuffer = new BitBuffer(); + BitBuffer bb = new BitBuffer(); if (assignVal < 0) throw new IllegalArgumentException("ECI assignment value out of range"); else if (assignVal < (1 << 7)) - bitBuffer.appendBits(assignVal, 8); + bb.appendBits(assignVal, 8); else if (assignVal < (1 << 14)) { - bitBuffer.appendBits(2, 2); - bitBuffer.appendBits(assignVal, 14); + bb.appendBits(2, 2); + bb.appendBits(assignVal, 14); } else if (assignVal < 1_000_000) { - bitBuffer.appendBits(6, 3); - bitBuffer.appendBits(assignVal, 21); + bb.appendBits(6, 3); + bb.appendBits(assignVal, 21); } else throw new IllegalArgumentException("ECI assignment value out of range"); - return new QrSegment(Mode.ECI, 0, bitBuffer); + return new QrSegment(Mode.ECI, 0, bb); } From 9064c8816e9a29a04fb98ec866780b94330e82d1 Mon Sep 17 00:00:00 2001 From: jaemi Date: Sat, 6 Jun 2020 17:13:05 +0900 Subject: [PATCH 03/23] Refactoring object : QrSegment.java Reason : BitBuffer bb is too simple to express meaning bitBuffer. So, rename bb to bitBuffer --- .../java/io/nayuki/qrcodegen/QrSegment.java | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index f416200..170d9d2 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -58,10 +58,10 @@ public final class QrSegment { */ public static QrSegment makeBytes(byte[] data) { Objects.requireNonNull(data); - BitBuffer bb = new BitBuffer(); + BitBuffer bitBuffer = new BitBuffer(); for (byte b : data) - bb.appendBits(b & 0xFF, 8); - return new QrSegment(Mode.BYTE, data.length, bb); + bitBuffer.appendBits(b & 0xFF, 8); + return new QrSegment(Mode.BYTE, data.length, bitBuffer); } @@ -77,13 +77,13 @@ public final class QrSegment { if (!NUMERIC_REGEX.matcher(digits).matches()) throw new IllegalArgumentException("String contains non-numeric characters"); - BitBuffer bb = new BitBuffer(); + BitBuffer bitBuffer = new BitBuffer(); for (int i = 0; i < digits.length(); ) { // Consume up to 3 digits per iteration int n = Math.min(digits.length() - i, 3); - bb.appendBits(Integer.parseInt(digits.substring(i, i + n)), n * 3 + 1); + bitBuffer.appendBits(Integer.parseInt(digits.substring(i, i + n)), n * 3 + 1); i += n; } - return new QrSegment(Mode.NUMERIC, digits.length(), bb); + return new QrSegment(Mode.NUMERIC, digits.length(), bitBuffer); } @@ -101,16 +101,16 @@ public final class QrSegment { if (!ALPHANUMERIC_REGEX.matcher(text).matches()) throw new IllegalArgumentException("String contains unencodable characters in alphanumeric mode"); - BitBuffer bb = new BitBuffer(); + BitBuffer bitBuffer = new BitBuffer(); int i; for (i = 0; i <= text.length() - 2; i += 2) { // Process groups of 2 int temp = ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45; temp += ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1)); - bb.appendBits(temp, 11); + bitBuffer.appendBits(temp, 11); } if (i < text.length()) // 1 character remaining - bb.appendBits(ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6); - return new QrSegment(Mode.ALPHANUMERIC, text.length(), bb); + bitBuffer.appendBits(ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6); + return new QrSegment(Mode.ALPHANUMERIC, text.length(), bitBuffer); } @@ -145,20 +145,20 @@ public final class QrSegment { * @throws IllegalArgumentException if the value is outside the range [0, 106) */ public static QrSegment makeEci(int assignVal) { - BitBuffer bb = new BitBuffer(); + BitBuffer bitBuffer = new BitBuffer(); if (assignVal < 0) throw new IllegalArgumentException("ECI assignment value out of range"); else if (assignVal < (1 << 7)) - bb.appendBits(assignVal, 8); + bitBuffer.appendBits(assignVal, 8); else if (assignVal < (1 << 14)) { - bb.appendBits(2, 2); - bb.appendBits(assignVal, 14); + bitBuffer.appendBits(2, 2); + bitBuffer.appendBits(assignVal, 14); } else if (assignVal < 1_000_000) { - bb.appendBits(6, 3); - bb.appendBits(assignVal, 21); + bitBuffer.appendBits(6, 3); + bitBuffer.appendBits(assignVal, 21); } else throw new IllegalArgumentException("ECI assignment value out of range"); - return new QrSegment(Mode.ECI, 0, bb); + return new QrSegment(Mode.ECI, 0, bitBuffer); } From 4d458bd91ac0d26eb5844d8b97a959c8bff652af Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sat, 6 Jun 2020 17:19:12 +0900 Subject: [PATCH 04/23] hello --- .../java/io/nayuki/qrcodegen/QrSegment.java | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index 170d9d2..f416200 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -58,10 +58,10 @@ public final class QrSegment { */ public static QrSegment makeBytes(byte[] data) { Objects.requireNonNull(data); - BitBuffer bitBuffer = new BitBuffer(); + BitBuffer bb = new BitBuffer(); for (byte b : data) - bitBuffer.appendBits(b & 0xFF, 8); - return new QrSegment(Mode.BYTE, data.length, bitBuffer); + bb.appendBits(b & 0xFF, 8); + return new QrSegment(Mode.BYTE, data.length, bb); } @@ -77,13 +77,13 @@ public final class QrSegment { if (!NUMERIC_REGEX.matcher(digits).matches()) throw new IllegalArgumentException("String contains non-numeric characters"); - BitBuffer bitBuffer = new BitBuffer(); + BitBuffer bb = new BitBuffer(); for (int i = 0; i < digits.length(); ) { // Consume up to 3 digits per iteration int n = Math.min(digits.length() - i, 3); - bitBuffer.appendBits(Integer.parseInt(digits.substring(i, i + n)), n * 3 + 1); + bb.appendBits(Integer.parseInt(digits.substring(i, i + n)), n * 3 + 1); i += n; } - return new QrSegment(Mode.NUMERIC, digits.length(), bitBuffer); + return new QrSegment(Mode.NUMERIC, digits.length(), bb); } @@ -101,16 +101,16 @@ public final class QrSegment { if (!ALPHANUMERIC_REGEX.matcher(text).matches()) throw new IllegalArgumentException("String contains unencodable characters in alphanumeric mode"); - BitBuffer bitBuffer = new BitBuffer(); + BitBuffer bb = new BitBuffer(); int i; for (i = 0; i <= text.length() - 2; i += 2) { // Process groups of 2 int temp = ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45; temp += ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1)); - bitBuffer.appendBits(temp, 11); + bb.appendBits(temp, 11); } if (i < text.length()) // 1 character remaining - bitBuffer.appendBits(ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6); - return new QrSegment(Mode.ALPHANUMERIC, text.length(), bitBuffer); + bb.appendBits(ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6); + return new QrSegment(Mode.ALPHANUMERIC, text.length(), bb); } @@ -145,20 +145,20 @@ public final class QrSegment { * @throws IllegalArgumentException if the value is outside the range [0, 106) */ public static QrSegment makeEci(int assignVal) { - BitBuffer bitBuffer = new BitBuffer(); + BitBuffer bb = new BitBuffer(); if (assignVal < 0) throw new IllegalArgumentException("ECI assignment value out of range"); else if (assignVal < (1 << 7)) - bitBuffer.appendBits(assignVal, 8); + bb.appendBits(assignVal, 8); else if (assignVal < (1 << 14)) { - bitBuffer.appendBits(2, 2); - bitBuffer.appendBits(assignVal, 14); + bb.appendBits(2, 2); + bb.appendBits(assignVal, 14); } else if (assignVal < 1_000_000) { - bitBuffer.appendBits(6, 3); - bitBuffer.appendBits(assignVal, 21); + bb.appendBits(6, 3); + bb.appendBits(assignVal, 21); } else throw new IllegalArgumentException("ECI assignment value out of range"); - return new QrSegment(Mode.ECI, 0, bitBuffer); + return new QrSegment(Mode.ECI, 0, bb); } From fd8f38b395df8b7b127f66f343e0085a88f06e1f Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sat, 6 Jun 2020 17:25:18 +0900 Subject: [PATCH 05/23] Refactoring operation name : rename Refactoring object : QrSegment.java Reason : BitBuffer bb is too simple to express meaning bitBuffer.So,rename bb to bitBuffer --- .../java/io/nayuki/qrcodegen/QrSegment.java | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index f416200..170d9d2 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -58,10 +58,10 @@ public final class QrSegment { */ public static QrSegment makeBytes(byte[] data) { Objects.requireNonNull(data); - BitBuffer bb = new BitBuffer(); + BitBuffer bitBuffer = new BitBuffer(); for (byte b : data) - bb.appendBits(b & 0xFF, 8); - return new QrSegment(Mode.BYTE, data.length, bb); + bitBuffer.appendBits(b & 0xFF, 8); + return new QrSegment(Mode.BYTE, data.length, bitBuffer); } @@ -77,13 +77,13 @@ public final class QrSegment { if (!NUMERIC_REGEX.matcher(digits).matches()) throw new IllegalArgumentException("String contains non-numeric characters"); - BitBuffer bb = new BitBuffer(); + BitBuffer bitBuffer = new BitBuffer(); for (int i = 0; i < digits.length(); ) { // Consume up to 3 digits per iteration int n = Math.min(digits.length() - i, 3); - bb.appendBits(Integer.parseInt(digits.substring(i, i + n)), n * 3 + 1); + bitBuffer.appendBits(Integer.parseInt(digits.substring(i, i + n)), n * 3 + 1); i += n; } - return new QrSegment(Mode.NUMERIC, digits.length(), bb); + return new QrSegment(Mode.NUMERIC, digits.length(), bitBuffer); } @@ -101,16 +101,16 @@ public final class QrSegment { if (!ALPHANUMERIC_REGEX.matcher(text).matches()) throw new IllegalArgumentException("String contains unencodable characters in alphanumeric mode"); - BitBuffer bb = new BitBuffer(); + BitBuffer bitBuffer = new BitBuffer(); int i; for (i = 0; i <= text.length() - 2; i += 2) { // Process groups of 2 int temp = ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45; temp += ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1)); - bb.appendBits(temp, 11); + bitBuffer.appendBits(temp, 11); } if (i < text.length()) // 1 character remaining - bb.appendBits(ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6); - return new QrSegment(Mode.ALPHANUMERIC, text.length(), bb); + bitBuffer.appendBits(ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6); + return new QrSegment(Mode.ALPHANUMERIC, text.length(), bitBuffer); } @@ -145,20 +145,20 @@ public final class QrSegment { * @throws IllegalArgumentException if the value is outside the range [0, 106) */ public static QrSegment makeEci(int assignVal) { - BitBuffer bb = new BitBuffer(); + BitBuffer bitBuffer = new BitBuffer(); if (assignVal < 0) throw new IllegalArgumentException("ECI assignment value out of range"); else if (assignVal < (1 << 7)) - bb.appendBits(assignVal, 8); + bitBuffer.appendBits(assignVal, 8); else if (assignVal < (1 << 14)) { - bb.appendBits(2, 2); - bb.appendBits(assignVal, 14); + bitBuffer.appendBits(2, 2); + bitBuffer.appendBits(assignVal, 14); } else if (assignVal < 1_000_000) { - bb.appendBits(6, 3); - bb.appendBits(assignVal, 21); + bitBuffer.appendBits(6, 3); + bitBuffer.appendBits(assignVal, 21); } else throw new IllegalArgumentException("ECI assignment value out of range"); - return new QrSegment(Mode.ECI, 0, bb); + return new QrSegment(Mode.ECI, 0, bitBuffer); } From da0b9906e4634e9201a9a4f7693118c8b679d461 Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sat, 6 Jun 2020 17:30:02 +0900 Subject: [PATCH 06/23] Refactoring operation name : rename Refactoring object : makeBytes(byte[] data) Reason : byte b is too simple to express meaning one byte. So,rename b to one_byte --- java/src/main/java/io/nayuki/qrcodegen/QrSegment.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index 170d9d2..59606e5 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -59,9 +59,9 @@ public final class QrSegment { public static QrSegment makeBytes(byte[] data) { Objects.requireNonNull(data); BitBuffer bitBuffer = new BitBuffer(); - for (byte b : data) - bitBuffer.appendBits(b & 0xFF, 8); - return new QrSegment(Mode.BYTE, data.length, bitBuffer); + for (byte one_byte : data) + bitBuffer.appendBits(one_byte & 0xFF, 8); + return new QrSegment(QrSegment.Mode.BYTE, data.length, bitBuffer); } From bc243c25433405a4652ee59fe61a5b47fd460547 Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sat, 6 Jun 2020 17:35:36 +0900 Subject: [PATCH 07/23] Refactoring operation name : rename Refactoring object : makeSegments(String text) Reason : List result is too simple to express meaning segments. So,rename result to segments --- java/src/main/java/io/nayuki/qrcodegen/QrSegment.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index 59606e5..f4c4b5d 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -125,15 +125,15 @@ public final class QrSegment { Objects.requireNonNull(text); // Select the most efficient segment encoding automatically - List result = new ArrayList<>(); + List segments = new ArrayList<>(); if (text.equals("")); // Leave result empty else if (NUMERIC_REGEX.matcher(text).matches()) - result.add(makeNumeric(text)); + segments.add(makeNumeric(text)); else if (ALPHANUMERIC_REGEX.matcher(text).matches()) - result.add(makeAlphanumeric(text)); + segments.add(makeAlphanumeric(text)); else - result.add(makeBytes(text.getBytes(StandardCharsets.UTF_8))); - return result; + segments.add(makeBytes(text.getBytes(StandardCharsets.UTF_8))); + return segments; } From 98ba80ec067c4c32d94bb7b9c43e51b4c84d3ed4 Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sat, 6 Jun 2020 17:38:17 +0900 Subject: [PATCH 08/23] Refactoring operation name : rename Refactoring object : makeEci(int assignValue) Reason : int assignVal is short to express meaning assignValue. So,rename assignVal to assignValue. --- .../main/java/io/nayuki/qrcodegen/QrSegment.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index f4c4b5d..6111865 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -144,18 +144,18 @@ public final class QrSegment { * @return a segment (not {@code null}) containing the data * @throws IllegalArgumentException if the value is outside the range [0, 106) */ - public static QrSegment makeEci(int assignVal) { + public static QrSegment makeEci(int assignValue) { BitBuffer bitBuffer = new BitBuffer(); - if (assignVal < 0) + if (assignValue < 0) throw new IllegalArgumentException("ECI assignment value out of range"); - else if (assignVal < (1 << 7)) - bitBuffer.appendBits(assignVal, 8); - else if (assignVal < (1 << 14)) { + else if (assignValue < (1 << 7)) + bitBuffer.appendBits(assignValue, 8); + else if (assignValue < (1 << 14)) { bitBuffer.appendBits(2, 2); - bitBuffer.appendBits(assignVal, 14); - } else if (assignVal < 1_000_000) { + bitBuffer.appendBits(assignValue, 14); + } else if (assignValue < 1_000_000) { bitBuffer.appendBits(6, 3); - bitBuffer.appendBits(assignVal, 21); + bitBuffer.appendBits(assignValue, 21); } else throw new IllegalArgumentException("ECI assignment value out of range"); return new QrSegment(Mode.ECI, 0, bitBuffer); From 76b671b7677d3eddcc5dd75a1885e0781fbe24c0 Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sat, 6 Jun 2020 17:40:40 +0900 Subject: [PATCH 09/23] Refactoring operation name : rename Refactoring object : QrSegment(Mode md, int numCh, BitBuffer data) Reason : Mode md, int numCh is short to express meaning . So,rename md to _mode and numCh to _numberOfCharacters --- java/src/main/java/io/nayuki/qrcodegen/QrSegment.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index 6111865..52c9d69 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -29,6 +29,8 @@ import java.util.List; import java.util.Objects; import java.util.regex.Pattern; +import QrSegment.Mode; + /** * A segment of character/binary/control data in a QR Code symbol. @@ -189,16 +191,15 @@ public final class QrSegment { * @throws NullPointerException if the mode or data is {@code null} * @throws IllegalArgumentException if the character count is negative */ - public QrSegment(Mode md, int numCh, BitBuffer data) { - mode = Objects.requireNonNull(md); + public QrSegment(Mode _mode, int _numberOfCharacters, BitBuffer data) { + mode = Objects.requireNonNull(_mode); Objects.requireNonNull(data); - if (numCh < 0) + if (_numberOfCharacters < 0) throw new IllegalArgumentException("Invalid value"); - numChars = numCh; + numberOfCharacters = _numberOfCharacters; this.data = data.clone(); // Make defensive copy } - /*---- Methods ----*/ /** From 27b1a3a23889ca9b28512260b5353664a85e8269 Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sat, 6 Jun 2020 17:48:06 +0900 Subject: [PATCH 10/23] Refactoring operation name : rename Refactoring object : getTotalBits(List segments, int version) Reason : some value names are too simple to express meaning . So,rename result to TotalBits, seg to segment, segs to segments, ccbits to characterCountBits --- .../main/java/io/nayuki/qrcodegen/QrSegment.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index 52c9d69..0fb22b6 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -229,6 +229,20 @@ public final class QrSegment { return (int)result; } + static int getTotalBits(List segments, int version) { + Objects.requireNonNull(segments); + long TotalBits = 0; + for (QrSegment segment : segments) { + Objects.requireNonNull(segment); + int characterCountBits = segment.mode.numCharCountBits(version); + if (segment.numberOfCharacters >= (1 << characterCountBits)) + return -1; // The segment's length doesn't fit the field's bit width + TotalBits += 4L + characterCountBits + segment.data.bitLength(); + if (TotalBits > Integer.MAX_VALUE) + return -1; // The sum will overflow an int type + } + return (int)TotalBits; + } /*---- Constants ----*/ From dd7d92aee6a52000ea3efaeb28631c4f06fff0fb Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sat, 6 Jun 2020 18:39:32 +0900 Subject: [PATCH 11/23] Refactoring operation name : extract method Refactoring object : makeBytes(byte[] data) Reason : part of code has possibility to change so, make this part to method(changeByteToSegment). --- java/src/main/java/io/nayuki/qrcodegen/QrSegment.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index 0fb22b6..ab8201b 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -62,10 +62,14 @@ public final class QrSegment { Objects.requireNonNull(data); BitBuffer bitBuffer = new BitBuffer(); for (byte one_byte : data) - bitBuffer.appendBits(one_byte & 0xFF, 8); + changeByteToSegment(bitBuffer, one_byte); return new QrSegment(QrSegment.Mode.BYTE, data.length, bitBuffer); } + public static void changeByteToSegment(BitBuffer bitBuffer, byte one_byte) { + bitBuffer.appendBits(one_byte & 0xFF, 8); + } + /** * Returns a segment representing the specified string of decimal digits encoded in numeric mode. From 50bf7cf2dc099ccd1d9a5b55e8782d273d4b3952 Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sat, 6 Jun 2020 18:44:47 +0900 Subject: [PATCH 12/23] Refactoring operation name : extract method Refactoring object : makeNumeric(String digits) Reason : part of code has possibility to change so, make this part to method(changeNumericToSegment). And part of code is complicated boolean expression so, make this part to method(containNonNumericCharaters) --- .../main/java/io/nayuki/qrcodegen/QrSegment.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index ab8201b..4953ab9 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -78,20 +78,28 @@ public final class QrSegment { * @throws NullPointerException if the string is {@code null} * @throws IllegalArgumentException if the string contains non-digit characters */ - public static QrSegment makeNumeric(String digits) { + public QrSegment makeNumeric(String digits) { Objects.requireNonNull(digits); - if (!NUMERIC_REGEX.matcher(digits).matches()) + if (containNonNumericCharaters(digits)) throw new IllegalArgumentException("String contains non-numeric characters"); BitBuffer bitBuffer = new BitBuffer(); + changeNumericToSegment(digits, bitBuffer); + return new QrSegment(QrSegment.Mode.NUMERIC, digits.length(), bitBuffer); + } + + public static void changeNumericToSegment(String digits, BitBuffer bitBuffer) { for (int i = 0; i < digits.length(); ) { // Consume up to 3 digits per iteration int n = Math.min(digits.length() - i, 3); bitBuffer.appendBits(Integer.parseInt(digits.substring(i, i + n)), n * 3 + 1); i += n; } - return new QrSegment(Mode.NUMERIC, digits.length(), bitBuffer); } + public static boolean containNonNumericCharaters(String digits) { + return !QrSegment.NUMERIC_REGEX.matcher(digits).matches(); + } + /** /** * Returns a segment representing the specified text string encoded in alphanumeric mode. From 658630752ee7b2c22746411c334f2237e4cfc2db Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sat, 6 Jun 2020 18:46:29 +0900 Subject: [PATCH 13/23] Refactoring operation name : extract method Refactoring object : makeAlphanumeric(String text) Reason : part of code has possibility to change so, make this part to method(changeAlphaNumericStringToSegment). --- .../java/io/nayuki/qrcodegen/QrSegment.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index 4953ab9..92c8746 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -109,25 +109,27 @@ public final class QrSegment { * @return a segment (not {@code null}) containing the text * @throws NullPointerException if the string is {@code null} * @throws IllegalArgumentException if the string contains non-encodable characters - */ - public static QrSegment makeAlphanumeric(String text) { + */ + public QrSegment makeAlphanumeric(String text) { Objects.requireNonNull(text); - if (!ALPHANUMERIC_REGEX.matcher(text).matches()) + if (!QrSegment.ALPHANUMERIC_REGEX.matcher(text).matches()) throw new IllegalArgumentException("String contains unencodable characters in alphanumeric mode"); BitBuffer bitBuffer = new BitBuffer(); + changeAlphaNumericStringToSegment(text, bitBuffer); + return new QrSegment(QrSegment.Mode.ALPHANUMERIC, text.length(), bitBuffer); + } + + public static void changeAlphaNumericStringToSegment(String text, BitBuffer bitBuffer) { int i; for (i = 0; i <= text.length() - 2; i += 2) { // Process groups of 2 - int temp = ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45; - temp += ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1)); + int temp = QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45; + temp += QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1)); bitBuffer.appendBits(temp, 11); } if (i < text.length()) // 1 character remaining - bitBuffer.appendBits(ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6); - return new QrSegment(Mode.ALPHANUMERIC, text.length(), bitBuffer); + bitBuffer.appendBits(QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6); } - - /** * Returns a list of zero or more segments to represent the specified Unicode text string. * The result may use various segment modes and switch modes to optimize the length of the bit stream. From 33c8042f00a6c38e913c694322145d7e2128f3ce Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sat, 6 Jun 2020 20:31:10 +0900 Subject: [PATCH 14/23] Refactoring operation name : extract class Refactoring object : MakeBytesToSegment Reason : makeBytes, changeByteToSegment has independent role. So, make these function to class(MakeBytesToSegment). --- .../nayuki/qrcodegen/MakeBytesToSegment.java | 36 +++++++++++++++++++ .../java/io/nayuki/qrcodegen/QrSegment.java | 22 ------------ 2 files changed, 36 insertions(+), 22 deletions(-) create mode 100644 java/src/main/java/io/nayuki/qrcodegen/MakeBytesToSegment.java diff --git a/java/src/main/java/io/nayuki/qrcodegen/MakeBytesToSegment.java b/java/src/main/java/io/nayuki/qrcodegen/MakeBytesToSegment.java new file mode 100644 index 0000000..807d574 --- /dev/null +++ b/java/src/main/java/io/nayuki/qrcodegen/MakeBytesToSegment.java @@ -0,0 +1,36 @@ +import java.nio.charset.StandardCharsets; +import java.util.Objects; + +public class MakeBytesToSegment implements MakeSegment { + + /** + * Returns a segment representing the specified binary data + * encoded in byte mode. All input byte arrays are acceptable. + *

Any text string can be converted to UTF-8 bytes ({@code + * s.getBytes(StandardCharsets.UTF_8)}) and encoded as a byte mode segment.

+ * @param data the binary data (not {@code null}) + * @return a segment (not {@code null}) containing the data + * @throws NullPointerException if the array is {@code null} + */ + public QrSegment excute(String text) { + byte[] data = text.getBytes(StandardCharsets.UTF_8)); + + Objects.requireNonNull(data); + BitBuffer bitBuffer = new BitBuffer(); + for (byte bits : data) + changeByteToSegment(bitBuffer, bits); + return new QrSegment(QrSegment.Mode.BYTE, data.length, bitBuffer); + } + + public QrSegment excuteForBytedata(byte[] data) { + Objects.requireNonNull(data); + BitBuffer bitBuffer = new BitBuffer(); + for (byte bits : data) + changeByteToSegment(bitBuffer, bits); + return new QrSegment(QrSegment.Mode.BYTE, data.length, bitBuffer); + } + + public static void changeByteToSegment(BitBuffer bitBuffer, byte bits) { + bitBuffer.appendBits(bits & 0xFF, 8); + } +} diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index 92c8746..67cce84 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -49,28 +49,6 @@ public final class QrSegment { /*---- Static factory functions (mid level) ----*/ - /** - * Returns a segment representing the specified binary data - * encoded in byte mode. All input byte arrays are acceptable. - *

Any text string can be converted to UTF-8 bytes ({@code - * s.getBytes(StandardCharsets.UTF_8)}) and encoded as a byte mode segment.

- * @param data the binary data (not {@code null}) - * @return a segment (not {@code null}) containing the data - * @throws NullPointerException if the array is {@code null} - */ - public static QrSegment makeBytes(byte[] data) { - Objects.requireNonNull(data); - BitBuffer bitBuffer = new BitBuffer(); - for (byte one_byte : data) - changeByteToSegment(bitBuffer, one_byte); - return new QrSegment(QrSegment.Mode.BYTE, data.length, bitBuffer); - } - - public static void changeByteToSegment(BitBuffer bitBuffer, byte one_byte) { - bitBuffer.appendBits(one_byte & 0xFF, 8); - } - - /** * Returns a segment representing the specified string of decimal digits encoded in numeric mode. * @param digits the text (not {@code null}), with only digits from 0 to 9 allowed From 937a2dfc53ca041b17d612fe1aae478d088ef329 Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sat, 6 Jun 2020 20:34:23 +0900 Subject: [PATCH 15/23] Refactoring operation name : extract class Refactoring object : MakeBytesToSegment Reason : makeNumeric, changeNumericToSegment, containNonNumericCharaters has independent role. So, make these function to class(MakeNumericToSegment). --- .../qrcodegen/MakeNumericToSegment.java | 33 +++++++++++++++++++ .../java/io/nayuki/qrcodegen/QrSegment.java | 30 ----------------- 2 files changed, 33 insertions(+), 30 deletions(-) create mode 100644 java/src/main/java/io/nayuki/qrcodegen/MakeNumericToSegment.java diff --git a/java/src/main/java/io/nayuki/qrcodegen/MakeNumericToSegment.java b/java/src/main/java/io/nayuki/qrcodegen/MakeNumericToSegment.java new file mode 100644 index 0000000..3da7b7e --- /dev/null +++ b/java/src/main/java/io/nayuki/qrcodegen/MakeNumericToSegment.java @@ -0,0 +1,33 @@ +import java.util.Objects; + +public class MakeNumericToSegment implements MakeSegment { + + /** + * Returns a segment representing the specified string of decimal digits encoded in numeric mode. + * @param digits the text (not {@code null}), with only digits from 0 to 9 allowed + * @return a segment (not {@code null}) containing the text + * @throws NullPointerException if the string is {@code null} + * @throws IllegalArgumentException if the string contains non-digit characters + */ + public QrSegment excute(String digits) { + Objects.requireNonNull(digits); + if (containNonNumericCharaters(digits)) + throw new IllegalArgumentException("String contains non-numeric characters"); + + BitBuffer bitBuffer = new BitBuffer(); + changeNumericToSegment(digits, bitBuffer); + return new QrSegment(QrSegment.Mode.NUMERIC, digits.length(), bitBuffer); + } + + public static void changeNumericToSegment(String digits, BitBuffer bitBuffer) { + for (int i = 0; i < digits.length(); ) { // Consume up to 3 digits per iteration + int n = Math.min(digits.length() - i, 3); + bitBuffer.appendBits(Integer.parseInt(digits.substring(i, i + n)), n * 3 + 1); + i += n; + } + } + + public static boolean containNonNumericCharaters(String digits) { + return !QrSegment.NUMERIC_REGEX.matcher(digits).matches(); + } +} diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index 67cce84..4b12881 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -49,36 +49,6 @@ public final class QrSegment { /*---- Static factory functions (mid level) ----*/ - /** - * Returns a segment representing the specified string of decimal digits encoded in numeric mode. - * @param digits the text (not {@code null}), with only digits from 0 to 9 allowed - * @return a segment (not {@code null}) containing the text - * @throws NullPointerException if the string is {@code null} - * @throws IllegalArgumentException if the string contains non-digit characters - */ - public QrSegment makeNumeric(String digits) { - Objects.requireNonNull(digits); - if (containNonNumericCharaters(digits)) - throw new IllegalArgumentException("String contains non-numeric characters"); - - BitBuffer bitBuffer = new BitBuffer(); - changeNumericToSegment(digits, bitBuffer); - return new QrSegment(QrSegment.Mode.NUMERIC, digits.length(), bitBuffer); - } - - public static void changeNumericToSegment(String digits, BitBuffer bitBuffer) { - for (int i = 0; i < digits.length(); ) { // Consume up to 3 digits per iteration - int n = Math.min(digits.length() - i, 3); - bitBuffer.appendBits(Integer.parseInt(digits.substring(i, i + n)), n * 3 + 1); - i += n; - } - } - - public static boolean containNonNumericCharaters(String digits) { - return !QrSegment.NUMERIC_REGEX.matcher(digits).matches(); - } - /** - /** * Returns a segment representing the specified text string encoded in alphanumeric mode. * The characters allowed are: 0 to 9, A to Z (uppercase only), space, From 27dc7057c9a154bb46efbfa771e55452477b9597 Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sat, 6 Jun 2020 20:36:50 +0900 Subject: [PATCH 16/23] Refactoring operation name : extract class Refactoring object : MakeAlphaNumericToSegment Reason : makeAlphanumeric, changeAlphaNumericStringToSegment has independent role. So, make these function to class(MakeAlphaNumericToSegment). --- .../qrcodegen/MakeAlphaNumericToSegment.java | 34 +++++++++++++++++++ .../java/io/nayuki/qrcodegen/QrSegment.java | 29 ---------------- 2 files changed, 34 insertions(+), 29 deletions(-) create mode 100644 java/src/main/java/io/nayuki/qrcodegen/MakeAlphaNumericToSegment.java diff --git a/java/src/main/java/io/nayuki/qrcodegen/MakeAlphaNumericToSegment.java b/java/src/main/java/io/nayuki/qrcodegen/MakeAlphaNumericToSegment.java new file mode 100644 index 0000000..66bd854 --- /dev/null +++ b/java/src/main/java/io/nayuki/qrcodegen/MakeAlphaNumericToSegment.java @@ -0,0 +1,34 @@ +import java.util.Objects; + +public class MakeAlphaNumericToSegment implements MakeSegment { + + /** + * Returns a segment representing the specified text string encoded in alphanumeric mode. + * The characters allowed are: 0 to 9, A to Z (uppercase only), space, + * dollar, percent, asterisk, plus, hyphen, period, slash, colon. + * @param text the text (not {@code null}), with only certain characters allowed + * @return a segment (not {@code null}) containing the text + * @throws NullPointerException if the string is {@code null} + * @throws IllegalArgumentException if the string contains non-encodable characters + */ + public QrSegment excute(String text) { + Objects.requireNonNull(text); + if (!QrSegment.ALPHANUMERIC_REGEX.matcher(text).matches()) + throw new IllegalArgumentException("String contains unencodable characters in alphanumeric mode"); + + BitBuffer bitBuffer = new BitBuffer(); + changeAlphaNumericStringToSegment(text, bitBuffer); + return new QrSegment(QrSegment.Mode.ALPHANUMERIC, text.length(), bitBuffer); + } + + public static void changeAlphaNumericStringToSegment(String text, BitBuffer bitBuffer) { + int i; + for (i = 0; i <= text.length() - 2; i += 2) { // Process groups of 2 + int temp = QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45; + temp += QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1)); + bitBuffer.appendBits(temp, 11); + } + if (i < text.length()) // 1 character remaining + bitBuffer.appendBits(QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6); + } +} diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index 4b12881..3d261f7 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -49,35 +49,6 @@ public final class QrSegment { /*---- Static factory functions (mid level) ----*/ - /** - * Returns a segment representing the specified text string encoded in alphanumeric mode. - * The characters allowed are: 0 to 9, A to Z (uppercase only), space, - * dollar, percent, asterisk, plus, hyphen, period, slash, colon. - * @param text the text (not {@code null}), with only certain characters allowed - * @return a segment (not {@code null}) containing the text - * @throws NullPointerException if the string is {@code null} - * @throws IllegalArgumentException if the string contains non-encodable characters - */ - public QrSegment makeAlphanumeric(String text) { - Objects.requireNonNull(text); - if (!QrSegment.ALPHANUMERIC_REGEX.matcher(text).matches()) - throw new IllegalArgumentException("String contains unencodable characters in alphanumeric mode"); - - BitBuffer bitBuffer = new BitBuffer(); - changeAlphaNumericStringToSegment(text, bitBuffer); - return new QrSegment(QrSegment.Mode.ALPHANUMERIC, text.length(), bitBuffer); - } - - public static void changeAlphaNumericStringToSegment(String text, BitBuffer bitBuffer) { - int i; - for (i = 0; i <= text.length() - 2; i += 2) { // Process groups of 2 - int temp = QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45; - temp += QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1)); - bitBuffer.appendBits(temp, 11); - } - if (i < text.length()) // 1 character remaining - bitBuffer.appendBits(QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6); - } /** * Returns a list of zero or more segments to represent the specified Unicode text string. * The result may use various segment modes and switch modes to optimize the length of the bit stream. From 9f70303e5ded7def81ff607cafabcac397325b61 Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sat, 6 Jun 2020 21:12:34 +0900 Subject: [PATCH 17/23] 1. Design pattern name : Factory method pattern 2. Design pattern object : QrSegment, MakeAlphaNumericToSegment,MakeBytesToSegment, MakeNumericToSegment 3. reason : function to make segment is changed by kind of string. And there is possible to add function to make segment. 4. explanation : product : MakeSegment, concrete product : MakeBytesToSegment, MakeNumericToSegment, MakeAlphaNumericToSegment creator : QrSegmentTo concrete creator : MakeSegmentFactory --- .../java/io/nayuki/qrcodegen/MakeSegment.java | 4 ++++ .../io/nayuki/qrcodegen/MakeSegmentFactory.java | 15 +++++++++++++++ .../main/java/io/nayuki/qrcodegen/QrSegment.java | 10 ++++++++++ 3 files changed, 29 insertions(+) create mode 100644 java/src/main/java/io/nayuki/qrcodegen/MakeSegment.java create mode 100644 java/src/main/java/io/nayuki/qrcodegen/MakeSegmentFactory.java diff --git a/java/src/main/java/io/nayuki/qrcodegen/MakeSegment.java b/java/src/main/java/io/nayuki/qrcodegen/MakeSegment.java new file mode 100644 index 0000000..ccca2ba --- /dev/null +++ b/java/src/main/java/io/nayuki/qrcodegen/MakeSegment.java @@ -0,0 +1,4 @@ + +public interface MakeSegment { + public QrSegment excute(String text); +} diff --git a/java/src/main/java/io/nayuki/qrcodegen/MakeSegmentFactory.java b/java/src/main/java/io/nayuki/qrcodegen/MakeSegmentFactory.java new file mode 100644 index 0000000..b21a516 --- /dev/null +++ b/java/src/main/java/io/nayuki/qrcodegen/MakeSegmentFactory.java @@ -0,0 +1,15 @@ +public class MakeSegmentFactory { + public static MakeSegment getMakeSegment(String text) { + MakeSegment makeSegment = null; + + if (text.equals("")); // Leave result empty + else if (QrSegment.NUMERIC_REGEX.matcher(text).matches()) + makeSegment = new MakeNumericToSegment(); + else if (QrSegment.ALPHANUMERIC_REGEX.matcher(text).matches()) + makeSegment = new MakeAlphaNumericToSegment(); + else + makeSegment = new MakeBytesToSegment(); + + return makeSegment; + } +} diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index 3d261f7..780b1bc 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -71,7 +71,17 @@ public final class QrSegment { return segments; } + public static List makeSegments(String text) { + Objects.requireNonNull(text); + // Select the most efficient segment encoding automatically + List segments = new ArrayList<>(); + + MakeSegment makeSegment = MakeSegmentFactory.getMakeSegment(text); + + segments.add(makeSegment.excute(text)); + return segments; + } /** * Returns a segment representing an Extended Channel Interpretation * (ECI) designator with the specified assignment value. From ec2976f6fa8a6747b0a9e7b2d85466ed863dfd9a Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sat, 6 Jun 2020 21:15:40 +0900 Subject: [PATCH 18/23] Refactoring operation name : rename Refactoring object : QrCodeGeneratorDemo.java Reason : QrCode qr, List segs is too simple to express meaning. So,rename qr to qrCode and segs to segments. --- .settings/org.eclipse.core.resources.prefs | 2 + .../nayuki/qrcodegen/QrCodeGeneratorDemo.java | 88 +++++++++---------- 2 files changed, 46 insertions(+), 44 deletions(-) create mode 100644 .settings/org.eclipse.core.resources.prefs diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..e5bd3bf --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding//java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorDemo.java=UTF-8 diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorDemo.java b/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorDemo.java index 3c50bda..a001ff9 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorDemo.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorDemo.java @@ -70,22 +70,22 @@ public final class QrCodeGeneratorDemo { // Creates a variety of QR Codes that exercise different features of the library, and writes each one to file. private static void doVarietyDemo() throws IOException { - QrCode qr; + QrCode qrCode; // Numeric mode encoding (3.33 bits per digit) - qr = QrCode.encodeText("314159265358979323846264338327950288419716939937510", QrCode.Ecc.MEDIUM); - writePng(qr.toImage(13, 1), "pi-digits-QR.png"); + qrCode = QrCode.encodeText("314159265358979323846264338327950288419716939937510", QrCode.Ecc.MEDIUM); + writePng(qrCode.toImage(13, 1), "pi-digits-QR.png"); // Alphanumeric mode encoding (5.5 bits per character) - qr = QrCode.encodeText("DOLLAR-AMOUNT:$39.87 PERCENTAGE:100.00% OPERATIONS:+-*/", QrCode.Ecc.HIGH); - writePng(qr.toImage(10, 2), "alphanumeric-QR.png"); + qrCode = QrCode.encodeText("DOLLAR-AMOUNT:$39.87 PERCENTAGE:100.00% OPERATIONS:+-*/", QrCode.Ecc.HIGH); + writePng(qrCode.toImage(10, 2), "alphanumeric-QR.png"); // Unicode text as UTF-8 - qr = QrCode.encodeText("こんにちwa、世界! αβγδ", QrCode.Ecc.QUARTILE); - writePng(qr.toImage(10, 3), "unicode-QR.png"); + qrCode = QrCode.encodeText("占쎄괭占쎄뎐占쎄쾽占쎄굶wa占쎄낌�닟占쎈르塋딉옙 �뀭汝뷸Ь�걣", QrCode.Ecc.QUARTILE); + writePng(qrCode.toImage(10, 3), "unicode-QR.png"); // Moderately large QR Code using longer text (from Lewis Carroll's Alice in Wonderland) - qr = QrCode.encodeText( + qrCode = QrCode.encodeText( "Alice was beginning to get very tired of sitting by her sister on the bank, " + "and of having nothing to do: once or twice she had peeped into the book her sister was reading, " + "but it had no pictures or conversations in it, 'and what is the use of a book,' thought Alice " @@ -93,74 +93,74 @@ public final class QrCodeGeneratorDemo { + "for the hot day made her feel very sleepy and stupid), whether the pleasure of making a " + "daisy-chain would be worth the trouble of getting up and picking the daisies, when suddenly " + "a White Rabbit with pink eyes ran close by her.", QrCode.Ecc.HIGH); - writePng(qr.toImage(6, 10), "alice-wonderland-QR.png"); + writePng(qrCode.toImage(6, 10), "alice-wonderland-QR.png"); } // Creates QR Codes with manually specified segments for better compactness. private static void doSegmentDemo() throws IOException { - QrCode qr; - List segs; + QrCode qrCode; + List segments; // Illustration "silver" String silver0 = "THE SQUARE ROOT OF 2 IS 1."; String silver1 = "41421356237309504880168872420969807856967187537694807317667973799"; - qr = QrCode.encodeText(silver0 + silver1, QrCode.Ecc.LOW); - writePng(qr.toImage(10, 3), "sqrt2-monolithic-QR.png"); + qrCode = QrCode.encodeText(silver0 + silver1, QrCode.Ecc.LOW); + writePng(qrCode.toImage(10, 3), "sqrt2-monolithic-QR.png"); - segs = Arrays.asList( + segments = Arrays.asList( QrSegment.makeAlphanumeric(silver0), QrSegment.makeNumeric(silver1)); - qr = QrCode.encodeSegments(segs, QrCode.Ecc.LOW); - writePng(qr.toImage(10, 3), "sqrt2-segmented-QR.png"); + qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.LOW); + writePng(qrCode.toImage(10, 3), "sqrt2-segmented-QR.png"); // Illustration "golden" - String golden0 = "Golden ratio φ = 1."; + String golden0 = "Golden ratio 占쏙옙 = 1."; String golden1 = "6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374"; String golden2 = "......"; - qr = QrCode.encodeText(golden0 + golden1 + golden2, QrCode.Ecc.LOW); - writePng(qr.toImage(8, 5), "phi-monolithic-QR.png"); + qrCode = QrCode.encodeText(golden0 + golden1 + golden2, QrCode.Ecc.LOW); + writePng(qrCode.toImage(8, 5), "phi-monolithic-QR.png"); - segs = Arrays.asList( + segments = Arrays.asList( QrSegment.makeBytes(golden0.getBytes(StandardCharsets.UTF_8)), QrSegment.makeNumeric(golden1), QrSegment.makeAlphanumeric(golden2)); - qr = QrCode.encodeSegments(segs, QrCode.Ecc.LOW); - writePng(qr.toImage(8, 5), "phi-segmented-QR.png"); + qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.LOW); + writePng(qrCode.toImage(8, 5), "phi-segmented-QR.png"); // Illustration "Madoka": kanji, kana, Cyrillic, full-width Latin, Greek characters - String madoka = "「魔法少女まどか☆マギカ」って、 ИАИ desu κα?"; - qr = QrCode.encodeText(madoka, QrCode.Ecc.LOW); - writePng(qr.toImage(9, 4), "madoka-utf8-QR.png"); + String madoka = "占쎈슞異몌쫲類앹빼阿잙뀍寃뀐옙寃묕옙嫄�占쎌겳占쎄묻占쎄텤占쎄텠占쎈씞寃귨옙寃랃옙怨ο옙占쏙옙�꺂癒믪꼨占쏙옙影�袁ы맀影�蹂⑺맟占쏙옙鰲��뀭塋딉옙"; + qrCode = QrCode.encodeText(madoka, QrCode.Ecc.LOW); + writePng(qrCode.toImage(9, 4), "madoka-utf8-QR.png"); - segs = Arrays.asList(QrSegmentAdvanced.makeKanji(madoka)); - qr = QrCode.encodeSegments(segs, QrCode.Ecc.LOW); - writePng(qr.toImage(9, 4), "madoka-kanji-QR.png"); + segments = Arrays.asList(QrSegmentAdvanced.makeKanji(madoka)); + qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.LOW); + writePng(qrCode.toImage(9, 4), "madoka-kanji-QR.png"); } // Creates QR Codes with the same size and contents but different mask patterns. private static void doMaskDemo() throws IOException { - QrCode qr; - List segs; + QrCode qrCode; + List segments; // Project Nayuki URL - segs = QrSegment.makeSegments("https://www.nayuki.io/"); - qr = QrCode.encodeSegments(segs, QrCode.Ecc.HIGH, QrCode.MIN_VERSION, QrCode.MAX_VERSION, -1, true); // Automatic mask - writePng(qr.toImage(8, 6), "project-nayuki-automask-QR.png"); - qr = QrCode.encodeSegments(segs, QrCode.Ecc.HIGH, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 3, true); // Force mask 3 - writePng(qr.toImage(8, 6), "project-nayuki-mask3-QR.png"); + segments = QrSegment.makeSegments("https://www.nayuki.io/"); + qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.HIGH, QrCode.MIN_VERSION, QrCode.MAX_VERSION, -1, true); // Automatic mask + writePng(qrCode.toImage(8, 6), "project-nayuki-automask-QR.png"); + qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.HIGH, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 3, true); // Force mask 3 + writePng(qrCode.toImage(8, 6), "project-nayuki-mask3-QR.png"); // Chinese text as UTF-8 - segs = QrSegment.makeSegments("維基百科(Wikipedia,聆聽i/ˌwɪkᵻˈpiːdi.ə/)是一個自由內容、公開編輯且多語言的網路百科全書協作計畫"); - qr = QrCode.encodeSegments(segs, QrCode.Ecc.MEDIUM, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 0, true); // Force mask 0 - writePng(qr.toImage(10, 3), "unicode-mask0-QR.png"); - qr = QrCode.encodeSegments(segs, QrCode.Ecc.MEDIUM, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 1, true); // Force mask 1 - writePng(qr.toImage(10, 3), "unicode-mask1-QR.png"); - qr = QrCode.encodeSegments(segs, QrCode.Ecc.MEDIUM, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 5, true); // Force mask 5 - writePng(qr.toImage(10, 3), "unicode-mask5-QR.png"); - qr = QrCode.encodeSegments(segs, QrCode.Ecc.MEDIUM, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 7, true); // Force mask 7 - writePng(qr.toImage(10, 3), "unicode-mask7-QR.png"); + segments = QrSegment.makeSegments("力놂옙占쎌쓢占쎌뇥�뇖臾뺥렩Wikipedia塋딅슜嫄앾옙寃켲/占쎈샆�뎚藥�戮먮뒰i占쎈쫨i.占쏙옙/塋딅맚�궦鼇앾옙占쎈뿨�닅占쎈뎨占쎈�깍Ⅴ諛ㅿ옙怨⑸�띰옙堉�歷뜯몼�꽎鼇앸떱姨�亦껋쉮占쏙옙�돦力녠엽�윭占쎌뇥�뇖臾덈�뀐옙�럱占쎈쐭俑앹뮂怡ワ옙鍮�"); + qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.MEDIUM, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 0, true); // Force mask 0 + writePng(qrCode.toImage(10, 3), "unicode-mask0-QR.png"); + qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.MEDIUM, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 1, true); // Force mask 1 + writePng(qrCode.toImage(10, 3), "unicode-mask1-QR.png"); + qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.MEDIUM, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 5, true); // Force mask 5 + writePng(qrCode.toImage(10, 3), "unicode-mask5-QR.png"); + qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.MEDIUM, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 7, true); // Force mask 7 + writePng(qrCode.toImage(10, 3), "unicode-mask7-QR.png"); } From b4a141b111b45370f06ea3c691e3ee0ee5b0c0ae Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sat, 6 Jun 2020 21:21:48 +0900 Subject: [PATCH 19/23] Refactoring operation name : rename Refactoring object : processCase(Scanner input) Reason : int b, List segs, QrCode qr is too simple to express meaning. So,rename b to one_byte, segs to segments, qr to qrCode. --- .../qrcodegen/QrCodeGeneratorWorker.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorWorker.java b/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorWorker.java index 4cf9de3..a11a39e 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorWorker.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorWorker.java @@ -57,11 +57,11 @@ public final class QrCodeGeneratorWorker { boolean isAscii = true; byte[] data = new byte[length]; for (int i = 0; i < data.length; i++) { - int b = input.nextInt(); - if (b < 0 || b > 255) + int one_byte = input.nextInt(); + if (one_byte < 0 || one_byte > 255) throw new RuntimeException(); - data[i] = (byte)b; - isAscii &= b < 128; + data[i] = (byte)one_byte; + isAscii &= one_byte < 128; } // Read encoding parameters @@ -75,19 +75,19 @@ public final class QrCodeGeneratorWorker { throw new RuntimeException(); // Make segments for encoding - List segs; + List segments; if (isAscii) - segs = QrSegment.makeSegments(new String(data, StandardCharsets.US_ASCII)); + segments = QrSegment.makeSegments(new String(data, StandardCharsets.US_ASCII)); else - segs = Arrays.asList(QrSegment.makeBytes(data)); + segments = Arrays.asList(QrSegment.makeBytes(data)); try { // Try to make QR Code symbol - QrCode qr = QrCode.encodeSegments(segs, QrCode.Ecc.values()[errCorLvl], minVersion, maxVersion, mask, boostEcl != 0); + QrCode qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.values()[errCorLvl], minVersion, maxVersion, mask, boostEcl != 0); // Print grid of modules - System.out.println(qr.version); - for (int y = 0; y < qr.size; y++) { - for (int x = 0; x < qr.size; x++) - System.out.println(qr.getModule(x, y) ? 1 : 0); + System.out.println(qrCode.version); + for (int y = 0; y < qrCode.size; y++) { + for (int x = 0; x < qrCode.size; x++) + System.out.println(qrCode.getModule(x, y) ? 1 : 0); } } catch (DataTooLongException e) { From 112cf4a538627cabb0dce93d44546ab213dd53ca Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sun, 7 Jun 2020 12:43:53 +0900 Subject: [PATCH 20/23] final commit --- .../java/io/nayuki/qrcodegen/QrSegment.java | 109 +++++++++++------- 1 file changed, 68 insertions(+), 41 deletions(-) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index 780b1bc..5fbba48 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -29,14 +29,12 @@ import java.util.List; import java.util.Objects; import java.util.regex.Pattern; -import QrSegment.Mode; - /** * A segment of character/binary/control data in a QR Code symbol. * Instances of this class are immutable. *

The mid-level way to create a segment is to take the payload data and call a - * static factory function such as {@link QrSegment#makeNumeric(String)}. The low-level + * static factory function such as {@link MakeNumericToSegment#makeNumericToSegment(String)}. The low-level * way to create a segment is to custom-make the bit buffer and call the {@link * QrSegment#QrSegment(Mode,int,BitBuffer) constructor} with appropriate values.

*

This segment class imposes no length restrictions, but QR Codes have restrictions. @@ -49,6 +47,51 @@ public final class QrSegment { /*---- Static factory functions (mid level) ----*/ + /** + * Returns a segment representing the specified binary data + * encoded in byte mode. All input byte arrays are acceptable. + *

Any text string can be converted to UTF-8 bytes ({@code + * s.getBytes(StandardCharsets.UTF_8)}) and encoded as a byte mode segment.

+ * @param data the binary data (not {@code null}) + * @return a segment (not {@code null}) containing the data + * @throws NullPointerException if the array is {@code null} + */ + public static QrSegment makeBytes(byte[] data) { + MakeBytesToSegment makeBytesToSegment = new MakeBytesToSegment(); + + return makeBytesToSegment.excuteForBytedata(data); + } + + + /** + * Returns a segment representing the specified string of decimal digits encoded in numeric mode. + * @param digits the text (not {@code null}), with only digits from 0 to 9 allowed + * @return a segment (not {@code null}) containing the text + * @throws NullPointerException if the string is {@code null} + * @throws IllegalArgumentException if the string contains non-digit characters + */ + public static QrSegment makeNumeric(String digits) { + MakeSegment makeSegment = new MakeNumericToSegment(); + + return makeSegment.excute(digits); + } + + + /** + * Returns a segment representing the specified text string encoded in alphanumeric mode. + * The characters allowed are: 0 to 9, A to Z (uppercase only), space, + * dollar, percent, asterisk, plus, hyphen, period, slash, colon. + * @param text the text (not {@code null}), with only certain characters allowed + * @return a segment (not {@code null}) containing the text + * @throws NullPointerException if the string is {@code null} + * @throws IllegalArgumentException if the string contains non-encodable characters + */ + public static QrSegment makeAlphanumeric(String text) { + MakeSegment makeSegment = new MakeAlphaNumericToSegment(); + + return makeSegment.excute(text); + } + /** * Returns a list of zero or more segments to represent the specified Unicode text string. * The result may use various segment modes and switch modes to optimize the length of the bit stream. @@ -56,21 +99,6 @@ public final class QrSegment { * @return a new mutable list (not {@code null}) of segments (not {@code null}) containing the text * @throws NullPointerException if the text is {@code null} */ - public static List makeSegments(String text) { - Objects.requireNonNull(text); - - // Select the most efficient segment encoding automatically - List segments = new ArrayList<>(); - if (text.equals("")); // Leave result empty - else if (NUMERIC_REGEX.matcher(text).matches()) - segments.add(makeNumeric(text)); - else if (ALPHANUMERIC_REGEX.matcher(text).matches()) - segments.add(makeAlphanumeric(text)); - else - segments.add(makeBytes(text.getBytes(StandardCharsets.UTF_8))); - return segments; - } - public static List makeSegments(String text) { Objects.requireNonNull(text); // Select the most efficient segment encoding automatically @@ -82,10 +110,12 @@ public final class QrSegment { return segments; } + + /** * Returns a segment representing an Extended Channel Interpretation * (ECI) designator with the specified assignment value. - * @param assignVal the ECI assignment number (see the AIM ECI specification) + * @param assignValue the ECI assignment number (see the AIM ECI specification) * @return a segment (not {@code null}) containing the data * @throws IllegalArgumentException if the value is outside the range [0, 106) */ @@ -116,7 +146,7 @@ public final class QrSegment { /** The length of this segment's unencoded data. Measured in characters for * numeric/alphanumeric/kanji mode, bytes for byte mode, and 0 for ECI mode. * Always zero or positive. Not the same as the data's bit length. */ - public final int numChars; + public final int numberOfCharacters; // The data bits of this segment. Not null. Accessed through getData(). final BitBuffer data; @@ -128,8 +158,8 @@ public final class QrSegment { * Constructs a QR Code segment with the specified attributes and data. * The character count (numCh) must agree with the mode and the bit buffer length, * but the constraint isn't checked. The specified bit buffer is cloned and stored. - * @param md the mode (not {@code null}) - * @param numCh the data length in characters or bytes, which is non-negative + * @param _mode the mode (not {@code null}) + * @param _numberOfCharacters the data length in characters or bytes, which is non-negative * @param data the data bits (not {@code null}) * @throws NullPointerException if the mode or data is {@code null} * @throws IllegalArgumentException if the character count is negative @@ -143,6 +173,7 @@ public final class QrSegment { this.data = data.clone(); // Make defensive copy } + /*---- Methods ----*/ /** @@ -157,49 +188,45 @@ public final class QrSegment { // Calculates the number of bits needed to encode the given segments at the given version. // Returns a non-negative number if successful. Otherwise returns -1 if a segment has too // many characters to fit its length field, or the total bits exceeds Integer.MAX_VALUE. - static int getTotalBits(List segs, int version) { - Objects.requireNonNull(segs); - long result = 0; - for (QrSegment seg : segs) { - Objects.requireNonNull(seg); - int ccbits = seg.mode.numCharCountBits(version); - if (seg.numChars >= (1 << ccbits)) - return -1; // The segment's length doesn't fit the field's bit width - result += 4L + ccbits + seg.data.bitLength(); - if (result > Integer.MAX_VALUE) - return -1; // The sum will overflow an int type - } - return (int)result; - } - static int getTotalBits(List segments, int version) { Objects.requireNonNull(segments); long TotalBits = 0; for (QrSegment segment : segments) { Objects.requireNonNull(segment); int characterCountBits = segment.mode.numCharCountBits(version); - if (segment.numberOfCharacters >= (1 << characterCountBits)) + if (DoesNotSegmentLengthFitTheFieldBitWidth(segment, characterCountBits)) return -1; // The segment's length doesn't fit the field's bit width TotalBits += 4L + characterCountBits + segment.data.bitLength(); - if (TotalBits > Integer.MAX_VALUE) + if (IsTotalBitsOutOfIntegerRange(TotalBits)) return -1; // The sum will overflow an int type } return (int)TotalBits; } + + + public static boolean IsTotalBitsOutOfIntegerRange(long result) { + return result > Integer.MAX_VALUE; + } + + + public static boolean DoesNotSegmentLengthFitTheFieldBitWidth(QrSegment segment, int characterCountBits) { + return segment.numberOfCharacters >= (1 << characterCountBits); + } + /*---- Constants ----*/ /** Describes precisely all strings that are encodable in numeric mode. To test whether a * string {@code s} is encodable: {@code boolean ok = NUMERIC_REGEX.matcher(s).matches();}. * A string is encodable iff each character is in the range 0 to 9. - * @see #makeNumeric(String) */ + * @see MakeNumericToSegment#makeNumericToSegment(String) */ public static final Pattern NUMERIC_REGEX = Pattern.compile("[0-9]*"); /** Describes precisely all strings that are encodable in alphanumeric mode. To test whether a * string {@code s} is encodable: {@code boolean ok = ALPHANUMERIC_REGEX.matcher(s).matches();}. * A string is encodable iff each character is in the following set: 0 to 9, A to Z * (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon. - * @see #makeAlphanumeric(String) */ + * @see MakeAlphaNumericToSegment#makeAlphaNumericToSegment(String) */ public static final Pattern ALPHANUMERIC_REGEX = Pattern.compile("[A-Z0-9 $%*+./:-]*"); // The set of all legal characters in alphanumeric mode, where From 032f145df56dc25a6ffb6b1d0c46959decca214b Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sun, 7 Jun 2020 12:45:16 +0900 Subject: [PATCH 21/23] final commit 2 --- .../java/io/nayuki/qrcodegen/QrSegment.java | 37 ++++++------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index 5fbba48..307f549 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -29,12 +29,14 @@ import java.util.List; import java.util.Objects; import java.util.regex.Pattern; +import QrSegment.Mode; + /** * A segment of character/binary/control data in a QR Code symbol. * Instances of this class are immutable. *

The mid-level way to create a segment is to take the payload data and call a - * static factory function such as {@link MakeNumericToSegment#makeNumericToSegment(String)}. The low-level + * static factory function such as {@link QrSegment#makeNumeric(String)}. The low-level * way to create a segment is to custom-make the bit buffer and call the {@link * QrSegment#QrSegment(Mode,int,BitBuffer) constructor} with appropriate values.

*

This segment class imposes no length restrictions, but QR Codes have restrictions. @@ -46,7 +48,6 @@ import java.util.regex.Pattern; public final class QrSegment { /*---- Static factory functions (mid level) ----*/ - /** * Returns a segment representing the specified binary data * encoded in byte mode. All input byte arrays are acceptable. @@ -91,7 +92,6 @@ public final class QrSegment { return makeSegment.excute(text); } - /** * Returns a list of zero or more segments to represent the specified Unicode text string. * The result may use various segment modes and switch modes to optimize the length of the bit stream. @@ -99,6 +99,7 @@ public final class QrSegment { * @return a new mutable list (not {@code null}) of segments (not {@code null}) containing the text * @throws NullPointerException if the text is {@code null} */ + public static List makeSegments(String text) { Objects.requireNonNull(text); // Select the most efficient segment encoding automatically @@ -110,12 +111,10 @@ public final class QrSegment { return segments; } - - /** * Returns a segment representing an Extended Channel Interpretation * (ECI) designator with the specified assignment value. - * @param assignValue the ECI assignment number (see the AIM ECI specification) + * @param assignVal the ECI assignment number (see the AIM ECI specification) * @return a segment (not {@code null}) containing the data * @throws IllegalArgumentException if the value is outside the range [0, 106) */ @@ -146,7 +145,7 @@ public final class QrSegment { /** The length of this segment's unencoded data. Measured in characters for * numeric/alphanumeric/kanji mode, bytes for byte mode, and 0 for ECI mode. * Always zero or positive. Not the same as the data's bit length. */ - public final int numberOfCharacters; + public final int numChars; // The data bits of this segment. Not null. Accessed through getData(). final BitBuffer data; @@ -158,8 +157,8 @@ public final class QrSegment { * Constructs a QR Code segment with the specified attributes and data. * The character count (numCh) must agree with the mode and the bit buffer length, * but the constraint isn't checked. The specified bit buffer is cloned and stored. - * @param _mode the mode (not {@code null}) - * @param _numberOfCharacters the data length in characters or bytes, which is non-negative + * @param md the mode (not {@code null}) + * @param numCh the data length in characters or bytes, which is non-negative * @param data the data bits (not {@code null}) * @throws NullPointerException if the mode or data is {@code null} * @throws IllegalArgumentException if the character count is negative @@ -173,7 +172,6 @@ public final class QrSegment { this.data = data.clone(); // Make defensive copy } - /*---- Methods ----*/ /** @@ -194,39 +192,28 @@ public final class QrSegment { for (QrSegment segment : segments) { Objects.requireNonNull(segment); int characterCountBits = segment.mode.numCharCountBits(version); - if (DoesNotSegmentLengthFitTheFieldBitWidth(segment, characterCountBits)) + if (segment.numberOfCharacters >= (1 << characterCountBits)) return -1; // The segment's length doesn't fit the field's bit width TotalBits += 4L + characterCountBits + segment.data.bitLength(); - if (IsTotalBitsOutOfIntegerRange(TotalBits)) + if (TotalBits > Integer.MAX_VALUE) return -1; // The sum will overflow an int type } return (int)TotalBits; } - - - public static boolean IsTotalBitsOutOfIntegerRange(long result) { - return result > Integer.MAX_VALUE; - } - - - public static boolean DoesNotSegmentLengthFitTheFieldBitWidth(QrSegment segment, int characterCountBits) { - return segment.numberOfCharacters >= (1 << characterCountBits); - } - /*---- Constants ----*/ /** Describes precisely all strings that are encodable in numeric mode. To test whether a * string {@code s} is encodable: {@code boolean ok = NUMERIC_REGEX.matcher(s).matches();}. * A string is encodable iff each character is in the range 0 to 9. - * @see MakeNumericToSegment#makeNumericToSegment(String) */ + * @see #makeNumeric(String) */ public static final Pattern NUMERIC_REGEX = Pattern.compile("[0-9]*"); /** Describes precisely all strings that are encodable in alphanumeric mode. To test whether a * string {@code s} is encodable: {@code boolean ok = ALPHANUMERIC_REGEX.matcher(s).matches();}. * A string is encodable iff each character is in the following set: 0 to 9, A to Z * (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon. - * @see MakeAlphaNumericToSegment#makeAlphaNumericToSegment(String) */ + * @see #makeAlphanumeric(String) */ public static final Pattern ALPHANUMERIC_REGEX = Pattern.compile("[A-Z0-9 $%*+./:-]*"); // The set of all legal characters in alphanumeric mode, where From 5124c442036bb836b6ddd11ad504b8a88510f6ad Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sun, 7 Jun 2020 12:47:44 +0900 Subject: [PATCH 22/23] ananananna --- .../io/nayuki/qrcodegen/QrCodeGeneratorWorker.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorWorker.java b/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorWorker.java index a11a39e..4378963 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorWorker.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorWorker.java @@ -82,12 +82,12 @@ public final class QrCodeGeneratorWorker { segments = Arrays.asList(QrSegment.makeBytes(data)); try { // Try to make QR Code symbol - QrCode qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.values()[errCorLvl], minVersion, maxVersion, mask, boostEcl != 0); + QrCode qr = QrCode.encodeSegments(segments, QrCode.Ecc.values()[errCorLvl], minVersion, maxVersion, mask, boostEcl != 0); // Print grid of modules - System.out.println(qrCode.version); - for (int y = 0; y < qrCode.size; y++) { - for (int x = 0; x < qrCode.size; x++) - System.out.println(qrCode.getModule(x, y) ? 1 : 0); + System.out.println(qr.version); + for (int y = 0; y < qr.size; y++) { + for (int x = 0; x < qr.size; x++) + System.out.println(qr.getModule(x, y) ? 1 : 0); } } catch (DataTooLongException e) { From f879fec68dc717c092cae56c84f85f93bd135a9a Mon Sep 17 00:00:00 2001 From: jaemin7666 Date: Sun, 7 Jun 2020 12:55:19 +0900 Subject: [PATCH 23/23] error correction --- .../nayuki/qrcodegen/QrCodeGeneratorDemo.java | 40 +++++++++---------- .../qrcodegen/QrCodeGeneratorWorker.java | 2 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorDemo.java b/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorDemo.java index a001ff9..828eae6 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorDemo.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorDemo.java @@ -53,15 +53,15 @@ public final class QrCodeGeneratorDemo { // Creates a single QR Code, then writes it to a PNG file and an SVG file. private static void doBasicDemo() throws IOException { String text = "Hello, world!"; // User-supplied Unicode text - QrCode.Ecc errCorLvl = QrCode.Ecc.LOW; // Error correction level + Ecc errCorLvl = Ecc.LOW; // Error correction level - QrCode qr = QrCode.encodeText(text, errCorLvl); // Make the QR Code symbol + QrCode qrCode = QrCode.encodeText(text, errCorLvl); // Make the QR Code symbol - BufferedImage img = qr.toImage(10, 4); // Convert to bitmap image + BufferedImage img = qrCode.toImage(10, 4); // Convert to bitmap image File imgFile = new File("hello-world-QR.png"); // File path for output ImageIO.write(img, "png", imgFile); // Write image to file - String svg = qr.toSvgString(4); // Convert to SVG XML code + String svg = qrCode.toSvgString(4); // Convert to SVG XML code File svgFile = new File("hello-world-QR.svg"); // File path for output Files.write(svgFile.toPath(), // Write image to file svg.getBytes(StandardCharsets.UTF_8)); @@ -73,15 +73,15 @@ public final class QrCodeGeneratorDemo { QrCode qrCode; // Numeric mode encoding (3.33 bits per digit) - qrCode = QrCode.encodeText("314159265358979323846264338327950288419716939937510", QrCode.Ecc.MEDIUM); + qrCode = QrCode.encodeText("314159265358979323846264338327950288419716939937510", Ecc.MEDIUM); writePng(qrCode.toImage(13, 1), "pi-digits-QR.png"); // Alphanumeric mode encoding (5.5 bits per character) - qrCode = QrCode.encodeText("DOLLAR-AMOUNT:$39.87 PERCENTAGE:100.00% OPERATIONS:+-*/", QrCode.Ecc.HIGH); + qrCode = QrCode.encodeText("DOLLAR-AMOUNT:$39.87 PERCENTAGE:100.00% OPERATIONS:+-*/", Ecc.HIGH); writePng(qrCode.toImage(10, 2), "alphanumeric-QR.png"); // Unicode text as UTF-8 - qrCode = QrCode.encodeText("占쎄괭占쎄뎐占쎄쾽占쎄굶wa占쎄낌�닟占쎈르塋딉옙 �뀭汝뷸Ь�걣", QrCode.Ecc.QUARTILE); + qrCode = QrCode.encodeText("占쎄괭占쎄뎐占쎄쾽占쎄굶wa占쎄낌�닟占쎈르塋딉옙 �뀭汝뷸Ь�걣", Ecc.QUARTILE); writePng(qrCode.toImage(10, 3), "unicode-QR.png"); // Moderately large QR Code using longer text (from Lewis Carroll's Alice in Wonderland) @@ -92,7 +92,7 @@ public final class QrCodeGeneratorDemo { + "'without pictures or conversations?' So she was considering in her own mind (as well as she could, " + "for the hot day made her feel very sleepy and stupid), whether the pleasure of making a " + "daisy-chain would be worth the trouble of getting up and picking the daisies, when suddenly " - + "a White Rabbit with pink eyes ran close by her.", QrCode.Ecc.HIGH); + + "a White Rabbit with pink eyes ran close by her.", Ecc.HIGH); writePng(qrCode.toImage(6, 10), "alice-wonderland-QR.png"); } @@ -105,36 +105,36 @@ public final class QrCodeGeneratorDemo { // Illustration "silver" String silver0 = "THE SQUARE ROOT OF 2 IS 1."; String silver1 = "41421356237309504880168872420969807856967187537694807317667973799"; - qrCode = QrCode.encodeText(silver0 + silver1, QrCode.Ecc.LOW); + qrCode = QrCode.encodeText(silver0 + silver1, Ecc.LOW); writePng(qrCode.toImage(10, 3), "sqrt2-monolithic-QR.png"); segments = Arrays.asList( QrSegment.makeAlphanumeric(silver0), QrSegment.makeNumeric(silver1)); - qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.LOW); + qrCode = QrCode.encodeSegments(segments, Ecc.LOW); writePng(qrCode.toImage(10, 3), "sqrt2-segmented-QR.png"); // Illustration "golden" String golden0 = "Golden ratio 占쏙옙 = 1."; String golden1 = "6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374"; String golden2 = "......"; - qrCode = QrCode.encodeText(golden0 + golden1 + golden2, QrCode.Ecc.LOW); + qrCode = QrCode.encodeText(golden0 + golden1 + golden2, Ecc.LOW); writePng(qrCode.toImage(8, 5), "phi-monolithic-QR.png"); segments = Arrays.asList( QrSegment.makeBytes(golden0.getBytes(StandardCharsets.UTF_8)), QrSegment.makeNumeric(golden1), QrSegment.makeAlphanumeric(golden2)); - qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.LOW); + qrCode = QrCode.encodeSegments(segments, Ecc.LOW); writePng(qrCode.toImage(8, 5), "phi-segmented-QR.png"); // Illustration "Madoka": kanji, kana, Cyrillic, full-width Latin, Greek characters String madoka = "占쎈슞異몌쫲類앹빼阿잙뀍寃뀐옙寃묕옙嫄�占쎌겳占쎄묻占쎄텤占쎄텠占쎈씞寃귨옙寃랃옙怨ο옙占쏙옙�꺂癒믪꼨占쏙옙影�袁ы맀影�蹂⑺맟占쏙옙鰲��뀭塋딉옙"; - qrCode = QrCode.encodeText(madoka, QrCode.Ecc.LOW); + qrCode = QrCode.encodeText(madoka, Ecc.LOW); writePng(qrCode.toImage(9, 4), "madoka-utf8-QR.png"); segments = Arrays.asList(QrSegmentAdvanced.makeKanji(madoka)); - qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.LOW); + qrCode = QrCode.encodeSegments(segments, Ecc.LOW); writePng(qrCode.toImage(9, 4), "madoka-kanji-QR.png"); } @@ -146,20 +146,20 @@ public final class QrCodeGeneratorDemo { // Project Nayuki URL segments = QrSegment.makeSegments("https://www.nayuki.io/"); - qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.HIGH, QrCode.MIN_VERSION, QrCode.MAX_VERSION, -1, true); // Automatic mask + qrCode = QrCode.encodeSegments(segments, Ecc.HIGH, QrCode.MIN_VERSION, QrCode.MAX_VERSION, -1, true); // Automatic mask writePng(qrCode.toImage(8, 6), "project-nayuki-automask-QR.png"); - qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.HIGH, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 3, true); // Force mask 3 + qrCode = QrCode.encodeSegments(segments, Ecc.HIGH, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 3, true); // Force mask 3 writePng(qrCode.toImage(8, 6), "project-nayuki-mask3-QR.png"); // Chinese text as UTF-8 segments = QrSegment.makeSegments("力놂옙占쎌쓢占쎌뇥�뇖臾뺥렩Wikipedia塋딅슜嫄앾옙寃켲/占쎈샆�뎚藥�戮먮뒰i占쎈쫨i.占쏙옙/塋딅맚�궦鼇앾옙占쎈뿨�닅占쎈뎨占쎈�깍Ⅴ諛ㅿ옙怨⑸�띰옙堉�歷뜯몼�꽎鼇앸떱姨�亦껋쉮占쏙옙�돦力녠엽�윭占쎌뇥�뇖臾덈�뀐옙�럱占쎈쐭俑앹뮂怡ワ옙鍮�"); - qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.MEDIUM, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 0, true); // Force mask 0 + qrCode = QrCode.encodeSegments(segments, Ecc.MEDIUM, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 0, true); // Force mask 0 writePng(qrCode.toImage(10, 3), "unicode-mask0-QR.png"); - qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.MEDIUM, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 1, true); // Force mask 1 + qrCode = QrCode.encodeSegments(segments, Ecc.MEDIUM, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 1, true); // Force mask 1 writePng(qrCode.toImage(10, 3), "unicode-mask1-QR.png"); - qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.MEDIUM, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 5, true); // Force mask 5 + qrCode = QrCode.encodeSegments(segments, Ecc.MEDIUM, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 5, true); // Force mask 5 writePng(qrCode.toImage(10, 3), "unicode-mask5-QR.png"); - qrCode = QrCode.encodeSegments(segments, QrCode.Ecc.MEDIUM, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 7, true); // Force mask 7 + qrCode = QrCode.encodeSegments(segments, Ecc.MEDIUM, QrCode.MIN_VERSION, QrCode.MAX_VERSION, 7, true); // Force mask 7 writePng(qrCode.toImage(10, 3), "unicode-mask7-QR.png"); } diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorWorker.java b/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorWorker.java index 4378963..12d77e7 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorWorker.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrCodeGeneratorWorker.java @@ -82,7 +82,7 @@ public final class QrCodeGeneratorWorker { segments = Arrays.asList(QrSegment.makeBytes(data)); try { // Try to make QR Code symbol - QrCode qr = QrCode.encodeSegments(segments, QrCode.Ecc.values()[errCorLvl], minVersion, maxVersion, mask, boostEcl != 0); + QrCode qr = QrCode.encodeSegments(segments, Ecc.values()[errCorLvl], minVersion, maxVersion, mask, boostEcl != 0); // Print grid of modules System.out.println(qr.version); for (int y = 0; y < qr.size; y++) {