JavaScript中蓝牙打印机动态生成十六进制编码数据的问题
解决蓝牙打印机动态生成QR码转义序列的问题
问题核心
你尝试通过拼接"\x"+十六进制字符串的方式动态生成QR码长度字节,但这种方法无效——因为"\x"是JavaScript字符串字面量的编译时转义符,只能跟固定的十六进制数字,动态拼接的"\x"会被当成普通字符,无法解析为有效字节。
正确解决方案
直接使用String.fromCharCode()函数,将十进制的文本长度值转换为对应的ASCII字符(即打印机需要的字节),无需手动处理十六进制转换。
完整代码示例
// 示例:要生成QR码的目标文本 const qrContent = "Hello Bluetooth Printer"; // 获取文本的字节长度(若含中文、emoji等多字节字符,必须用字节数而非字符串长度) const contentByteLength = new TextEncoder().encode(qrContent).length; // 构建QR码打印命令 let qrCommand = ""; // 固定转义序列部分 qrCommand += "\x1b"; // 对应十进制27 qrCommand += "\x5a"; // 对应十进制90 qrCommand += "\x00"; // 对应十进制0 qrCommand += "\x02"; // 对应十进制2 qrCommand += "\x07"; // 对应十进制7 // 动态插入文本长度对应的字节 qrCommand += String.fromCharCode(contentByteLength); qrCommand += "\x00"; // 对应十进制0 // 追加要打印的QR码文本 qrCommand += qrContent;
关键说明
String.fromCharCode(n)会直接将十进制数值n转换为对应的ASCII字符,效果完全等价于字面量"\xAB"(其中AB是n的十六进制表示),能满足打印机的字节要求。- 若打印机要求的长度是字节数(而非字符串字符数),必须用
new TextEncoder().encode(文本).length计算,避免多字节字符导致长度统计错误。
内容的提问来源于stack exchange,提问作者Elie Asmar
相关产品推荐
相关产品推荐

