fix(windows): 枚举解码误判 UTF-16 为 UTF-8 导致设备路径碎片化——0x80 全假象
用户 Windows 无驱动实测日志破案:PavoApiW_x64 枚举成功(size=256),缓冲是
UTF-16LE 的裸 USB 设备路径(\\?\usb#vid_0d16&pid_0309#serial#{guid}),
但 printableRatio 把 \0 计为可打印字符,UTF-8 误判通过 → 路径被 \0 拆成
单字符碎片(first='\')→ CheckPrinterStatus/PrintOneCard 全部 0x80——
此前所有"离线"均为碎片名所致,设备与通信从未真正尝试过。
结论反转:**Windows 免驱动成立且必须免驱动**——PavoApi 直连裸 USB 设备
(GUID_DEVINTERFACE_USB_DEVICE);装 HiTi 驱动反而接管 USB 接口导致枚举为空
(用户实测:装驱动前枚举到、装后 size=0、卸载后又枚举到)。
修复:
- decodeAuto 增加 UTF-16LE 特征判定(奇数位字节全零)优先于比例启发;
新增守护测试(设备路径形态整串不碎片化)
- 向导 Windows 分支反转:不再提供驱动安装(mac only),文案明确
"SDK 直连无需驱动;已装 HiTi 驱动请卸载(驱动占用 USB 接口导致无法直连)"
This commit is contained in:
1 parent
e31ed4115c
commit
62909609d1
3 files changed
+44
-16
No files matched your search
@@ -71,7 +71,29 @@ class PavoPrinter {
|
||||
}
|
||||
|
||||
/// 按可打印字符占比自动判断 UTF-8 / UTF-16 编码。
|
||||
///
|
||||
/// 实测(Win11 无驱动裸机):枚举缓冲返回 UTF-16LE 的设备路径
|
||||
/// (\\?\usb#vid_xxxx&pid_xxxx#serial#{guid})。ASCII 的 UTF-16LE 呈现
|
||||
/// "奇数位字节全零"特征——printableRatio 会把 \0 算作可打印,导致 UTF-8
|
||||
/// 误判通过、路径被 \0 拆成单字符碎片(后续 API 拿 '\' 单字符全部 0x80)。
|
||||
/// 故先用奇数位全零特征做 UTF-16LE 判定,再回退比例启发。
|
||||
static String decodeAuto(Uint8List buf) {
|
||||
if (buf.length >= 8) {
|
||||
var oddAllZero = true;
|
||||
for (var i = 1; i < buf.length; i += 2) {
|
||||
if (buf[i] != 0) {
|
||||
oddAllZero = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (oddAllZero) {
|
||||
final codes = <int>[];
|
||||
for (var i = 0; i + 1 < buf.length; i += 2) {
|
||||
codes.add(buf[i] | (buf[i + 1] << 8));
|
||||
}
|
||||
return String.fromCharCodes(codes);
|
||||
}
|
||||
}
|
||||
final utf8Text = utf8.decode(buf, allowMalformed: true);
|
||||
if (printableRatio(utf8Text) >= 0.9) {
|
||||
return utf8Text;
|
||||
|
||||
Reference in new issue
Block a user