Просмотр исходного кода

Merge pull request #5 from mysterywolf/master

更新官方提交的pr
朱天龙 (Armink) 5 лет назад
Родитель
Сommit
d98e36b421
4 измененных файлов с 12 добавлено и 10 удалено
  1. 3 3
      README.md
  2. 3 3
      README_ZH.md
  3. 1 1
      samples/qrcode_sample.c
  4. 5 3
      src/qrcode.c

+ 3 - 3
README.md

@@ -64,9 +64,9 @@ qrcode_initText(&qrcode, qrcodeBytes, DEFAULT_QR_VERSION, ECC_LOW, "HELLO WORLD"
 The generated two-dimensional code is dot matrix data, 8 dots constitute a Byte. The following codes can be used to display the QR code
 
 ```c
-for (uint8 y = 0; y <qrcode.size; y++) {
-    for (uint8 x = 0; x <qrcode.size; x++) {
-        if (qrcode_getModule(&qrcode, x, y) {
+for (uint8_t y = 0; y <qrcode.size; y++) {
+    for (uint8_t x = 0; x <qrcode.size; x++) {
+        if (qrcode_getModule(&qrcode, x, y)) {
             rt_kprintf("**");
         } else {
             rt_kprintf(" ");

+ 3 - 3
README_ZH.md

@@ -64,9 +64,9 @@ qrcode_initText(&qrcode, qrcodeBytes, DEFAULT_QR_VERSION, ECC_LOW, "HELLO WORLD"
 生成的二维码是点阵数据,8个点构成一个 Byte。显示二维码可以使用以下代码
 
 ```c
-for (uint8 y = 0; y < qrcode.size; y++) {
-    for (uint8 x = 0; x < qrcode.size; x++) {
-        if (qrcode_getModule(&qrcode, x, y) {
+for (uint8_t y = 0; y < qrcode.size; y++) {
+    for (uint8_t x = 0; x < qrcode.size; x++) {
+        if (qrcode_getModule(&qrcode, x, y)) {
             rt_kprintf("**");
         } else {
             rt_kprintf("  ");

+ 1 - 1
samples/qrcode_sample.c

@@ -53,4 +53,4 @@ static void qrcode(uint8_t argc, char **argv)
     }
 }
 MSH_CMD_EXPORT(qrcode, qrcode generator: qrcode [string]);
-#endif /* defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) */
+#endif /* defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) */

+ 5 - 3
src/qrcode.c

@@ -190,7 +190,9 @@ static void bb_initGrid(BitBucket *bitGrid, uint8_t *data, uint8_t size) {
 static void bb_appendBits(BitBucket *bitBuffer, uint32_t val, uint8_t length) {
     uint32_t offset = bitBuffer->bitOffsetOrWidth;
     for (int8_t i = length - 1; i >= 0; i--, offset++) {
-        bitBuffer->data[offset >> 3] |= ((val >> i) & 1) << (7 - (offset & 7));
+        if (bitBuffer->capacityBytes > offset >> 3) {
+            bitBuffer->data[offset >> 3] |= ((val >> i) & 1) << (7 - (offset & 7));
+        }
     }
     bitBuffer->bitOffsetOrWidth = offset;
 }
@@ -739,7 +741,6 @@ uint16_t qrcode_getBufferSize(uint8_t version) {
     return bb_getGridSizeBytes(4 * version + 17);
 }
 
-// @TODO: Return error if data is too big.
 int8_t qrcode_initBytes(QRCode *qrcode, uint8_t *modules, uint8_t version, uint8_t ecc, uint8_t *data, uint16_t length) {
     uint8_t size = version * 4 + 17;
     qrcode->version = version;
@@ -773,7 +774,8 @@ int8_t qrcode_initBytes(QRCode *qrcode, uint8_t *modules, uint8_t version, uint8
     qrcode->mode = mode;
 
     // Add terminator and pad up to a byte if applicable
-    uint32_t padding = (dataCapacity * 8) - codewords.bitOffsetOrWidth;
+    int32_t padding = (dataCapacity * 8) - codewords.bitOffsetOrWidth;
+    if (padding < 0) { return -1; }
     if (padding > 4) { padding = 4; }
     bb_appendBits(&codewords, 0, padding);
     bb_appendBits(&codewords, 0, (8 - codewords.bitOffsetOrWidth % 8) % 8);