色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【C語言應用】如何用C代碼生成一維碼?

嵌入式物聯網開發 ? 來源:嵌入式物聯網開發 ? 作者:嵌入式物聯網開發 ? 2022-08-25 12:42 ? 次閱讀

前面的文章《如何用C代碼生成二維碼》中已經介紹過了libzint開源庫,我們也見識到了它的便捷性。本文將以如何生成一維碼為核心,淺談其他的實現方式和代碼技巧。

《如何用C代碼生成二維碼》文章中已經介紹了,我們通過自行封裝zint開源庫處理的接口函數如下:

/****************************************************************************

Descpribe: Create Qrcode API with C Code by calling zint lib.

Input : pQrCodeData, the qrcode data buf

    QrcodeLen, the len of qrcode data, but it can be 0

    pQrCodeFile, the output file name of qrcode, it can be NULL   

Output : pZintRet, to store the ret code from linzint.

Return : 0 is ok, and other values are fail. See the meanings in enum ZINT_RET_CODE

Notes : pQrCodeFile, Must end in .png, .eps or .svg. when isn,t NULL string.

****************************************************************************/

ZINT_RET_CODE Zint_Create_QrCode(uint8_t *pQrCodeData, int QrcodeLen, char *pQrCodeFile, int *pZintRet);

類似地,我們生成一維碼的接口函數也相近,如下所示:

/****************************************************************************

Descpribe: Create Barcode API with C Code by calling zint lib.

Input : pBarCodeData, the barcode data buf

    BarcodeLen, the len of barcode data, but it can be 0

    pBarCodeFile, the output file name of barcode, it can be NULL   

Output : pZintRet, to store the ret code from linzint.

Return : 0 is ok, and other values are fail. See the meanings in enum ZINT_RET_CODE

Notes : pBarCodeFile, Must end in .png, .eps or .svg. when isn,t NULL string.

****************************************************************************/

ZINT_RET_CODE Zint_Create_BarCode(uint8_t *pBarCodeData, int BarcodeLen, char *pBarCodeFile, int *pZintRet);

兩者幾乎是一個模板刻出來的,可想而知,其內部實現,自然也是邏輯都是差不多的,都是調用到libzint中的:

ZINT_EXTERN struct zint_symbol* ZBarcode_Create(void);

ZINT_EXTERN void ZBarcode_Clear(struct zint_symbol *symbol);

ZINT_EXTERN void ZBarcode_Delete(struct zint_symbol *symbol);

ZINT_EXTERN int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle);

等等函數。于是,我們就在想,可以把調用libzint庫中的函數封裝成一個共用的功能函數,然后生成一維碼和生產二維碼的函數都通過傳不同的參數進去,讓這個共用的功能函數走不同case就可以完成相應的功能了。于是我們開始改造zint_code.c,將這個功能函數提出取出來,命名為 ZINT_RET_CODE Zint_Create_Code_File(STR_ZINT_CODE *ZintCodeObj);

通過這個功能函數的入口,我們可以知道,我們定義了一個STR_ZINT_CODE結構體,里面的成員變量如下所列:

typedef struct

{

  uint8_t *pCodeData;

  int CodeLen;

  char *pCodeFile;

  CODE_TYPE CodeType;

  int MaxCodeLen;

  int *pZintRet;

}STR_ZINT_CODE; //struct for create code file

這樣我們就可以通過入參控制Zint_Create_Code_File函數來執行不同的生成功能了。

以下是改造后的zint_code.c和zint_code.h

/****************************************************************************
 * File       : zint_code.c
 * 
 * Copyright (c) 2011 by Li.Recan < 721317716@qq.com >
 * 
 * DESCRIPTION: Demo for creating qrcode by C code.
 * 
 * Modification history
 * --------------------------------------------------------------------------
 * Date         Version  Author       History
 * --------------------------------------------------------------------------
 * 2016-10-15   1.0.0    Li.Recan     written
 ***************************************************************************/
 
// Standard Library
#include 
#include 

// so Library
#include "zint.h"

// Project Header
#include "zint_code.h"


/****************************************************************************
Descpribe: Create Code file API with C Code by calling zint lib.
           It's a common api for create barcode or qrcode.
Input    : ZintCodeObj, the zint create code file object           
Output   : ZintCodeObj, the zint create code file object 
Return   : 0 is ok, and other values are fail. See the meanings in enum ZINT_RET_CODE
Notes    : null
****************************************************************************/
ZINT_RET_CODE Zint_Create_Code_File(STR_ZINT_CODE *ZintCodeObj)
{
    struct zint_symbol *pMySymbol     = NULL;
    int RetCode                     = 0;    
    int CodeTypeIn                  = 0;
    
    if(!ZintCodeObj) //check input pointer
    {
        return ZINT_ERR_INV_DATA;
    }

    //check code type
    if(ZINT_BARCODE == ZintCodeObj->CodeType)
    {
        CodeTypeIn = BARCODE_CODE128;
    }
    else if(ZINT_QRCODE == ZintCodeObj->CodeType)
    {
        CodeTypeIn = BARCODE_QRCODE;
    }
    
    if(ZintCodeObj->CodeLen == 0)
    {
        ZintCodeObj->CodeLen = strlen((char *)ZintCodeObj->pCodeData);
    }
    if(ZintCodeObj->CodeLen > ZintCodeObj->MaxCodeLen)//len is too long
    {        
        return ZINT_ERR_TOO_LONG;
    }

    if(0 == ZBarcode_ValidID(CodeTypeIn))
    {
        return ZINT_ERR_INV_CODE_ID;
    }
    
    pMySymbol = ZBarcode_Create();
    if(pMySymbol == NULL)
    {
        return ZINT_ERR_MEMORY;
    }

    if(ZintCodeObj->pCodeFile)//when it's NULL, outfile will be "out.png"
    {
        if(strstr(ZintCodeObj->pCodeFile, "png") || (strstr(ZintCodeObj->pCodeFile, "eps")) || (strstr(ZintCodeObj->pCodeFile, "svg")))
        {
            strcpy(pMySymbol->outfile, ZintCodeObj->pCodeFile);
        }
        else
        {
            ZBarcode_Clear(pMySymbol);
            ZBarcode_Delete(pMySymbol); //release memory in zint lib
            return ZINT_ERR_FILE_NAME;
        }
    }
    pMySymbol->symbology     = CodeTypeIn;  
    if(BARCODE_QRCODE == CodeTypeIn) // special for qrcode
    {
        pMySymbol->option_1     = 3; //ECC Level.It can be large when ECC Level is larger.(value:1-4)  
        pMySymbol->scale         = 4; //contorl qrcode file size, default is 1, used to be 4   
    }
    pMySymbol->border_width     = 2; //set white space width around your qrcode and 0 is for nothing 
    
    RetCode = ZBarcode_Encode_and_Print(pMySymbol, ZintCodeObj->pCodeData, ZintCodeObj->CodeLen, 0);    
    ZBarcode_Clear(pMySymbol);
    ZBarcode_Delete(pMySymbol); //release memory in zint lib

    if(ZintCodeObj->pZintRet)
    {
        *(ZintCodeObj->pZintRet) = RetCode; //save ret code from zint lib
    }
    
    return ((0 == RetCode) ? (ZINT_OK) : (ZINT_ERR_LIB_RET));
}

/****************************************************************************
Descpribe: Create Barcode API with C Code by calling zint lib.
Input    : pBarCodeData, the barcode data buf
           BarcodeLen, the len of barcode data, but it can be 0
           pBarCodeFile, the output file name of barcode, it can be NULL           
Output   : pZintRet, to store the ret code from linzint. 
Return   : 0 is ok, and other values are fail. See the meanings in enum ZINT_RET_CODE
Notes    : pBarCodeFile, Must end in .png, .eps or .svg. when isn,t NULL string.
****************************************************************************/
ZINT_RET_CODE Zint_Create_BarCode(uint8_t *pBarCodeData, int BarcodeLen, char *pBarCodeFile, int *pZintRet)
{
    STR_ZINT_CODE ZintCodeObj;
    
    memset(&ZintCodeObj, 0, sizeof(STR_ZINT_CODE));
    ZintCodeObj.pCodeData   = pBarCodeData;
    ZintCodeObj.CodeLen     = BarcodeLen;
    ZintCodeObj.pCodeFile   = pBarCodeFile;
    ZintCodeObj.pZintRet    = pZintRet;
    
    ZintCodeObj.CodeType    = ZINT_BARCODE;
    ZintCodeObj.MaxCodeLen  = BARCODE_MAX_LEN;
    
    return Zint_Create_Code_File(&ZintCodeObj);
}

/****************************************************************************
Descpribe: Create Qrcode API with C Code by calling zint lib.
Input    : pQrCodeData, the qrcode data buf
           QrcodeLen, the len of qrcode data, but it can be 0
           pQrCodeFile, the output file name of qrcode, it can be NULL           
Output   : pZintRet, to store the ret code from linzint. 
Return   : 0 is ok, and other values are fail. See the meanings in enum ZINT_RET_CODE
Notes    : pQrCodeFile, Must end in .png, .eps or .svg. when isn,t NULL string.
****************************************************************************/
ZINT_RET_CODE Zint_Create_QrCode(uint8_t *pQrCodeData, int QrcodeLen, char *pQrCodeFile, int *pZintRet)
{
    STR_ZINT_CODE ZintCodeObj;
    
    memset(&ZintCodeObj, 0, sizeof(STR_ZINT_CODE));
    ZintCodeObj.pCodeData   = pQrCodeData;
    ZintCodeObj.CodeLen     = QrcodeLen;
    ZintCodeObj.pCodeFile   = pQrCodeFile;
    ZintCodeObj.pZintRet    = pZintRet;
    
    ZintCodeObj.CodeType    = ZINT_QRCODE;
    ZintCodeObj.MaxCodeLen  = QRCODE_MAX_LEN;
    
    return Zint_Create_Code_File(&ZintCodeObj);
}
/****************************************************************************
 * File       : zint_code.h
 * 
 * Copyright (c) 2011 by Li.Recan < 721317716@qq.com >
 * 
 * DESCRIPTION: API for creating qrcode by C code.
 * 
 * Modification history
 * --------------------------------------------------------------------------
 * Date         Version  Author       History
 * --------------------------------------------------------------------------
 * 2016-10-15   1.0.0    Li.Recan     written
 ***************************************************************************/
 
#ifndef __ZINT_CODE__
#define __ZINT_CODE__

#ifdef __cplusplus
extern "C"
{
#endif

#include 

#define QRCODE_MAX_LEN        500 //max string len for creating qrcode
#define BARCODE_MAX_LEN        100 //max string len for creating barcode

typedef enum 
{
    ZINT_OK                 = 0,
    ZINT_ERR_INV_DATA         = -1, //input invalid data
    ZINT_ERR_TOO_LONG         = -2, //len for input data is too long    
    ZINT_ERR_INV_CODE_ID     = -3,//the code type is not supported by zint
    ZINT_ERR_MEMORY         = -4, //malloc memory error in zint lib
    ZINT_ERR_FILE_NAME        = -5, //qrcode file isn'y end in .png, .eps or .svg.
    ZINT_ERR_LIB_RET         = -6, //zint lib ret error, real ret code should be zint api ret code
}ZINT_RET_CODE;

typedef enum
{
    ZINT_BARCODE            = 1, //barcode type
    ZINT_QRCODE             = 2, //qrcode type
}CODE_TYPE;

typedef struct
{
    uint8_t *pCodeData;
    int CodeLen;
    char *pCodeFile;
    CODE_TYPE CodeType;
    int MaxCodeLen;
    int *pZintRet;
}STR_ZINT_CODE;  //struct for create code file

/****************************************************************************
Descpribe: Create Barcode API with C Code by calling zint lib.
Input    : pBarCodeData, the barcode data buf
           BarcodeLen, the len of barcode data, but it can be 0
           pBarCodeFile, the output file name of barcode, it can be NULL           
Output   : pZintRet, to store the ret code from linzint. 
Return   : 0 is ok, and other values are fail. See the meanings in enum ZINT_RET_CODE
Notes    : pBarCodeFile, Must end in .png, .eps or .svg. when isn,t NULL string.
****************************************************************************/
ZINT_RET_CODE Zint_Create_BarCode(uint8_t *pBarCodeData, int BarcodeLen, char *pBarCodeFile, int *pZintRet);

/****************************************************************************
Descpribe: Create Qrcode API with C Code by calling zint lib.
Input    : pQrCodeData, the qrcode data buf
           QrcodeLen, the len of qrcode data, but it can be 0
           pQrCodeFile, the output file name of qrcode, it can be NULL           
Output   : pZintRet, to store the ret code from linzint. 
Return   : 0 is ok, and other values are fail. See the meanings in enum ZINT_RET_CODE
Notes    : pQrCodeFile, Must end in .png, .eps or .svg. when isn,t NULL string.
****************************************************************************/
ZINT_RET_CODE Zint_Create_QrCode(uint8_t *pQrCodeData, int QrcodeLen, char *pQrCodeFile, int *pZintRet);

#define Debuging(fmt, arg...)       printf("[%20s, %4d] "fmt, __FILE__, __LINE__, ##arg)

#ifdef __cplusplus
}
#endif

#endif /* __ZINT_CODE__ */

下面我們通過一個demo程序來驗證下接口函數,即qrcode_test.c源程序,以下為其全部內容。

/****************************************************************************
 * File       : qrcode_test.c
 * 
 * Copyright (c) 2011 by Li.Recan < 721317716@qq.com >
 * 
 * DESCRIPTION: Demo for creating qrcode by C code.
 * 
 * Modification history
 * --------------------------------------------------------------------------
 * Date         Version  Author       History
 * --------------------------------------------------------------------------
 * 2016-10-15   1.0.0    Li.Recan     written
 ***************************************************************************/
 
// Standard Library
#include 

// Project Header
#include "zint_code.h"

int main(int argc, char *argv[])
{
    int ZintLibRet             = 0; //ret code from zint lib
    ZINT_RET_CODE ZintRet     = 0; //ret code from zint_code api
    char QrcodeData[]         = "I love zint lib. 測試一下gbk編碼 ...";
    char QrcodeDataDef[]     = "This's default qrcode file name : out.png ";
    char QrcodeFile[]         = "MyQrcode.png"; // Must end in .png, .eps or .svg. //zint lib ask !
    
    char BarcodeData[]      = "13430931801"; //barcode string
    char BarcodeFile[]      = "MyBarcode.png";
    
    //test with inputing qrcode_file name
    ZintRet = Zint_Create_QrCode((uint8_t*)QrcodeData, 0, QrcodeFile, &ZintLibRet);
    if(ZINT_OK != ZintRet)
    {
        Debuging("Create qrcode err, ZintRet = %d, ZintLibRet = %d\n", ZintRet, ZintLibRet);
    }
    else
    {
        Debuging("Create qrcode OK ! \nView qrcode file : %s in cur path. ZintRet = %d, ZintLibRet = %d\n", QrcodeFile, ZintRet, ZintLibRet);
    }
    
    //test without inputing qrcode_file name
    ZintRet = Zint_Create_QrCode((uint8_t*)QrcodeDataDef, 0, NULL, &ZintLibRet);
    if(ZINT_OK != ZintRet)
    {
        Debuging("Create qrcode err, ZintRet = %d, ZintLibRet = %d\n", ZintRet, ZintLibRet);
    }
    else
    {
        Debuging("Create qrcode OK ! \nView qrcode file : out.png in cur path. ZintRet = %d, ZintLibRet = %d\n", ZintRet, ZintLibRet);
    }
    
    //test create barcode with name "MyBarcode.png"
    ZintRet = Zint_Create_BarCode((uint8_t*)BarcodeData, 0, BarcodeFile, &ZintLibRet);
    if(ZINT_OK != ZintRet)
    {
        Debuging("Create barcode err, ZintRet = %d, ZintLibRet = %d\n", ZintRet, ZintLibRet);
    }
    else
    {
        Debuging("Create barcode OK ! \nView barcode file : %s in cur path. ZintRet = %d, ZintLibRet = %d\n", BarcodeFile, ZintRet, ZintLibRet);
    }    
        
    return 0;
}

前半部分還是保留上一次測試生產二維碼的代碼;而新增了生成一維碼的測試代碼。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?編輯

之后再運行demo程序,如下:

如框框所示,即為成功運行程序,生成的一維碼圖片。它的展示如下:

用微信等掃一掃工具,掃描結果如下:

結果正如我們代碼所寫,證明程序執行是沒有問題的。

好了,本期如何用C代碼生成一維碼就介紹到這里了。有興趣的童鞋可以私下聯系,互相學習。

?審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 二維碼
    +關注

    關注

    7

    文章

    424

    瀏覽量

    26452
  • C語言
    +關注

    關注

    180

    文章

    7604

    瀏覽量

    136692
  • C代碼
    +關注

    關注

    1

    文章

    89

    瀏覽量

    14297
收藏 人收藏

    評論

    相關推薦

    C語言應用】如何用C代碼生成維碼

    C語言應用】如何用C代碼生成維碼?
    的頭像 發表于 08-24 19:01 ?2184次閱讀
    【<b class='flag-5'>C</b><b class='flag-5'>語言</b>應用】如<b class='flag-5'>何用</b><b class='flag-5'>C</b><b class='flag-5'>代碼</b><b class='flag-5'>生成</b>二<b class='flag-5'>維碼</b>?

    懶人C51代碼生成

    懶人C51代碼生成器,款小軟件
    發表于 11-30 00:18

    請問誰有二維碼生成和解析源代碼?

    如題,最近對二維碼感興趣,誰有二維碼生成和解析源代碼,最好是C語言的,傳
    發表于 03-11 05:55

    何用STM32CubeMX生成底層代碼代碼C++的編寫要注意哪些事項?

    何用STM32CubeMX生成底層代碼?單片機代碼如何進行IDE的C++配置?代碼
    發表于 07-01 06:22

    51單片機生成維碼的步驟

    最近搞了個單片機生成維碼,步驟如下1.下載QRCode生成的驅動源代碼,這個驅動是c語言編寫的
    發表于 11-19 07:33

    何用C語言代碼去控制LED燈的亮滅呢

    何用匯編語言C語言環境進行初始化呢?如何用C語言代碼
    發表于 11-29 06:05

    模糊控制C語言生成工具

    電子發燒友網站提供《模糊控制C語言生成工具.zip》資料免費下載
    發表于 09-22 14:19 ?57次下載

    C語言中隨機數的生成代碼

    C語言中隨機數的生成完整代碼
    的頭像 發表于 02-20 09:21 ?1w次閱讀

    ATK QR二維碼和條碼識別庫的模塊資料和使用C語言代碼合集免費下載

    ATK QR二維碼和條碼識別庫的模塊資料和基于STM32使用的C語言代碼合集免費下載包括了:ATK_QR 二維碼&條形碼識別庫,程序源碼,二
    發表于 09-17 08:00 ?21次下載
    ATK QR二<b class='flag-5'>維碼</b>和條碼識別庫的模塊資料和使用<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>代碼</b>合集免費下載

    C語言高效編程與代碼優化

    翻譯作者:農網 gunner 在本篇文章中,我收集了很多經驗和方法。應用這些經驗和方法,可以幫助我們從執行速度和內存使用等方面來優化C語言代碼。 簡介在最近的
    的頭像 發表于 10-19 17:04 ?1670次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>高效編程與<b class='flag-5'>代碼</b>優化

    簡談二維碼(QRcode)的C語言生成,在單片機平臺的實現

    簡談二維碼(QRcode)的C語言生成,在單片機平臺的實現
    發表于 11-13 20:21 ?18次下載
    簡談二<b class='flag-5'>維碼</b>(QRcode)的<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>生成</b>,在單片機平臺的實現

    STM32C8T6顯示生成維碼資料合集

    STM32C8T6顯示生成維碼資料合集
    發表于 02-11 09:36 ?8次下載

    c語言如何把字符變成ascii

    C語言種廣泛應用的編程語言,用于開發各種類型的程序。在C語言中,字符可以表示為ASCII
    的頭像 發表于 11-26 10:34 ?6279次閱讀

    Labview生成維碼

    ?Labview 的個Demo,生成維碼。
    發表于 08-01 17:12 ?7次下載

    hex文件如何查看原c語言代碼

    是處理器可以直接執行的指令,而 C 語言代碼則是人類可讀的高級編程語言代碼。 然而,如果你想要從 .hex 文件中獲取
    的頭像 發表于 09-02 10:37 ?2133次閱讀
    主站蜘蛛池模板: 亚洲AV日韩AV欧美在线观看网| 情欲.美女高潮| 绝对诱惑在线试听| 久久综合狠狠综合狠狠| 免费精品国偷自产在线在线| 欧美ⅹxxxx18性欧美| 人驴交f ee欧美| 无码人妻丰满熟妇啪啪网不卡| 亚洲精品AV一区午夜福利| 野花视频在线观看免费| 中文字幕乱码一区AV久久| 99热久久视频只有精品6| 纯肉小黄文高H| 国产一级特黄a大片99| 久久伊人影院| 日韩AV无码一区二区三区不卡毛片 | 97人人看碰人免费公开视频| AV72啪啪网站| 国产精品九九久久精品视| 接吻吃胸摸下面啪啪教程| 男女AA片免费| 天美传媒在线观看完整高清| 一二三四中文字幕在线看| 99国产强伦姧在线看RAPE| 国产成人无码免费精品果冻传媒 | 拉菲娱乐主管高工资q39709| 欧美日韩精品一区二区三区四区 | 久久国产精品福利影集| 欧美高清videosgratis高| 无码射肉在线播放视频| 中文人妻熟妇精品乱又伦| 丰满的女友1在线观看| 九九大香尹人视频免费| 欧美AAAAAA级午夜福利视频| 午夜福利小视频400| 51久久夜色精品国产| 国产成人无码WWW免费视频在线| 老师系列高H文| 文中字幕一区二区三区视频播放| 中文日韩亚洲欧美字幕| 国产叼嘿久久精品久久|