tcp - 在 Tcl 中解码二进制数据
问题描述
我正在使用套接字从 TCL 中的 TCP 端口读取数据。消息不以任何换行符结尾,但它们确实包含一个包含数据字节数的标头。
我有以下代码从套接字(16位小端)读取两个字节的数据并将其转换为一个整数,然后我可以在循环中使用它来读取其余数据:
binary scan [read $Socket 2] s* length
在这种情况下,$Socket 是我的套接字,它已被配置为使用二进制编码。
除非高字节或低字节为 0x0D,否则此方法效果很好。看来 TCL 将 0x0D 和 0x0A 都读取为“\n”,然后默认为 0x0A,因此代码确实可以正常工作。例如 13 读作 10。如何阻止这种情况发生?
解决方案
如果要在其中移动二进制数据,则应将套接字置于二进制模式。
chan configure $Socket -translation binary
# Use [fconfigure] instead of [chan configure] in older Tcl versions
这会禁用 Tcl 通常执行的所有自动处理——你的描述说你遇到了行尾转换的问题——并使它read
只会传递一个字节字符串(正式地是 U+ 之间的字符串000000 和 U+0000FF,并在内部使用高效的内存编码方案)。
对于文件,您可以b
在打开时将其包含在控制模式中以完成此操作。对于套接字,您需要自己执行此操作。
推荐阅读
- parent-child - 如何在 HTML 父子关系中使用 2 个 Svelte 组件将数据从子代传递给父代
- ruby - 使用 next 关键字和空方法终止每个循环的技术目的是什么?
- amazon-web-services - 用于支持 AWS 批量执行的临时 s3 存储桶或不同的存储方法
- java - 我没有在 Java 中获得回文程序的输出
- svg - 结合几个SVG
- java - 如何为用户队列设计数据库
- asp.net - ID 为#### 的进程未运行。输出显示:“程序‘[4560] iisexpress.exe’已退出,代码为 0 (0x0)。”
- python - 我如何在整个数据集上应用数据增强
- python - 如何使用 joblib.Parallel() 来并行化一个带有一些“继续”的循环?
- python - AttributeError: '_tkinter.tkapp' 对象没有属性 'destoy