Electron/Node.js下符合TLV规范的QR码Base64编码实现正确性咨询
你的现有实现不符合TLV规范要求,存在4处核心错误:
- Tag编码错误:要求Tag占1字节,存储的是标签的数值(比如姓名对应Tag是数值1,对应二进制字节0x01),但你现在是把字符串"1"转为Buffer,实际存储的是字符"1"的ASCII码0x31,和要求完全不符。
- Length编码错误:要求Length占1字节,存储的是Value经UTF8编码后的字节数的数值,你现在是把长度数字转为字符串再转Buffer,比如姓名长度是4,你存的是字符"4"的ASCII码0x34而非数值4对应的字节0x04。另外你用
str.length取长度也不对,遇到中文等多字节字符时,str.length是字符数而非字节数,应该用Buffer.from(str).length取字节长度。 - 拼接逻辑错误:你现在是先把各部分转为十六进制字符串拼接,再将这个十六进制字符串转Base64,本质是对十六进制字符做编码,而非对原始TLV二进制字节编码,最终得到的Base64内容完全不符合要求,且长度会翻倍,很容易超出500字符的限制。
- 变量重名bug:代码中
length_s被重复赋值(姓名、薪资的长度都用了这个变量),拼接薪资字段的长度时会错误使用姓名的长度值,导致TLV结构错乱。
正确的实现应该直接操作二进制Buffer,不需要转十六进制字符串中转,示例修正代码如下:
const { Buffer } = require("buffer"); const crypto = require("crypto"); // 后续计算标签6的哈希使用 var name = "John"; // tag 1 var address = "88 times Circlem, new Castle"; // tag 2 var age = "42"; // tag 3 var salary = "8500.00"; // tag 4 var tax = "20"; // tag 5 // 标签6的XML薪资报告哈希,占位示例,后续替换为真实XML内容计算即可 const xmlHash = crypto.createHash('sha256').update('此处替换为XML薪资报告的原始内容').digest(); function generateTLVBase64(name, address, age, salary, tax, xmlHash) { // 统一配置字段参数,避免重复代码 const fields = [ { tag: 1, value: name }, { tag: 2, value: address }, { tag: 3, value: age }, { tag: 4, value: salary }, { tag: 5, value: tax }, { tag: 6, value: xmlHash, fixedLength: 32 } // 标签6长度固定为32字节 ]; const bufferList = []; for (const field of fields) { // 写入1字节Tag bufferList.push(Buffer.from([field.tag])); // 写入1字节Length const valueBuf = Buffer.isBuffer(field.value) ? field.value : Buffer.from(field.value, 'utf8'); const length = field.fixedLength ?? valueBuf.length; bufferList.push(Buffer.from([length])); // 写入Value bufferList.push(valueBuf); } // 拼接完整二进制后直接转Base64 const totalBuffer = Buffer.concat(bufferList); return totalBuffer.toString('base64'); } const resultBase64 = generateTLVBase64(name, address, age, salary, tax, xmlHash); console.log('符合要求的TLV Base64结果:', resultBase64); console.log('Base64长度校验:', resultBase64.length); // 可确认是否符合不超过500字符的要求
上述实现生成的Base64内容,编码的就是完全符合要求的TLV二进制结构,满足你的项目需求。
内容的提问来源于stack exchange,提问作者Maged
相关产品推荐
相关产品推荐

