10 函数 · QR 生成 + PNG · MIT(Nayuki)

qrcodegen 函数参考

有序字节流上的二进制应用层协议帧库:build.bat xtp 编入,32 字节头、四型消息(REQUEST / RESPONSE / PUSH / EVENT)、流式增量解析、完整 limits 体系。两个 inline 辅助(xtp2_text / xtp2_wants_reply)留在头文件里由脚本侧内联。

编码(4 函数)

qrcodegen_encodeText 编码

文本一步编码(自动选最优模式);调用方提供模块缓冲与临时缓冲(qrcodegen_BUFFER_LEN_MAX 或 calcSegmentBufferSize 计算)。ECC 四档(LOW/MEDIUM/QUARTILE/HIGH),min/maxVersion 0 为自动。

bool qrcodegen_encodeText(const char* text, uint8_t tempBuffer[], uint8_t qrcode[], enum qrcodegen_Ecc ecl, enum qrcodegen_Mode minMode, enum qrcodegen_Mode maxMode, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl);

qrcodegen_encodeBinary / encodeSegments / encodeSegmentsAdvanced 编码

二进制数据 / 分段 / 高级入口(手动 mask、boostEcl 控制)——分段编码可将数字与文本混合以获得最优压缩。

PNG 输出(xserver 辅助层)

qrcodegen_png 渲染

模块矩阵一步渲染为 1-bit 灰度 PNG:每模块 scale×scale 像素、四边 border 模块静区(规范建议 ≥ 4)。IDAT 经 xrt 的 XDEFLATE_ZLIB 流压缩(zlib 头/adler32 尾由 xrt 产出),每块 CRC32 本地实现。返回 xrtMalloc 缓冲(xrtFree 释放),*pOutSize 收长度;参数越界或分配失败返回 NULL。

unsigned char* qrcodegen_png(const uint8_t qrcode[], int scale, int border, size_t* pOutSize);
示例 · 编码到 PNG
uint8_t aQr[qrcodegen_BUFFER_LEN_MAX];
uint8_t aTemp[qrcodegen_BUFFER_LEN_MAX];
size_t iSize;
unsigned char* pPng;

if ( qrcodegen_encodeText("https://xs.xywhsoft.com",
    aTemp, aQr, qrcodegen_Ecc_MEDIUM,
    qrcodegen_Mode_BYTE, qrcodegen_Mode_BYTE, 0, 0,
    qrcodegen_Mask_AUTO, true) ) {
    pPng = qrcodegen_png(aQr, 4, 4, &iSize);
    /* pPng: PNG 字节流(357 字节 @ 33 模块 + 4 静区 × 4px) */
    xrtFree(pPng);
}

读取与探测(4 函数)

qrcodegen_getSize / getModule 读取

模块矩阵边长与逐模块取值(true=深色)——自定义渲染器(SVG、终端字符画、canvas)或直接写像素缓冲用。

int qrcodegen_getSize(const uint8_t qrcode[]); bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y);

qrcodegen_isNumeric / isAlphanumeric / calcSegmentBufferSize 探测

模式探测(数字/字母数字)供分段编码决策;calcSegmentBufferSize 计算分段所需临时缓冲。

上游零动态分配(缓冲由调用方提供);PNG 层是 xserver 扩展辅助(非上游内容),依赖宿主 xrt 的 deflate。完整源码见仓库 lib/qrcodegen。