开发者生态
morning
Show HN:ShadowCat – 在浏览器中通过二维码传输文件
2026-05-22
1 阅读
unprovable
ShadowCat 一个完全离线的单文件 HTML 页面,用于通过 QR 码在两个设备之间移动数据 - 适用于无线电(BLE、NFC 等)已失效但相机和浏览器仍然可以使用的旧手机。选项卡生成 — 将文本编码为单个 QR 码。扫描 — 通过摄像头解码单个 QR。发送文件 — 选择一个文件,选择块大小/FPS/ECC,点击开始。以选定的 FPS 永远循环[header, chunk1…chunkN]。暂停/恢复/停止。 Start from — 在选定的帧索引处开始循环;然后它继续向前并正常回绕到标头。 Show frame + Show / − / + — 显示一帧静态数据,用于重新发送特定的丢失块。该数字与接收器丢失块网格中显示的块索引匹配(0 = 标头)。接收文件 — 启动相机并指向发送者。标题自动检测,进度条填充,缺失块网格显示哪些块尚未到达。完成后,将验证文件的 CRC,并显示“下载”按钮。协议标头:QRX1|H|||| 数据:QRX1|D||(1 索引)Base64 字母表没有 | ,所以解析只是 split('|') 。接收器通过索引跟踪块,忽略重复项,通过 CRC 删除重复数据头。旧手机的实用注意事项相机需要 HTTPS 或 localhost — file:// 不会授予 getUserMedia 权限。使用 python3 -m http.server 8000 进行服务并通过本地网络访问 http://:8000/qrcode.html 。 iOS Safari 还需要 HTTPS 来进行跨设备访问——对于 LAN 设置,球童或自签名证书会有所帮助。如果某个帧渲染失败(“代码长度溢出”),请降低块大小或降低 ECC 级别。 500 个字符 × 3 fps ≈ 1.1 KB/s base64 ≈ 0.83 KB/s 原始数据。 100 KB 的文件每个循环大约需要 2 分钟;接收器通常需要 1-2 个环路。如果旧设备难以解码:降低 FPS、将 ECC 提高到 Q、将块缩小到约 300 个字符 — 会产生更小、密度更低的 QR。