首页 > 解决方案 > 在 Tcl 中解码二进制数据

问题描述

我正在使用套接字从 TCL 中的 TCP 端口读取数据。消息不以任何换行符结尾,但它们确实包含一个包含数据字节数的标头。

我有以下代码从套接字(16位小端)读取两个字节的数据并将其转换为一个整数,然后我可以在循环中使用它来读取其余数据:

  binary scan [read $Socket 2] s* length

在这种情况下,$Socket 是我的套接字,它已被配置为使用二进制编码。

除非高字节或低字节为 0x0D,否则此方法效果很好。看来 TCL 将 0x0D 和 0x0A 都读取为“\n”,然后默认为 0x0A,因此代码确实可以正常工作。例如 13 读作 10。如何阻止这种情况发生?

标签: tcpbinarytcl

解决方案


如果要在其中移动二进制数据,则应将套接字置于二进制模式。

chan configure $Socket -translation binary
# Use [fconfigure] instead of [chan configure] in older Tcl versions

这会禁用 Tcl 通常执行的所有自动处理——你的描述说你遇到了行尾转换的问题——并使它read只会传递一个字节字符串(正式地是 U+ 之间的字符串000000 和 U+0000FF,并在内部使用高效的内存编码方案)。

对于文件,您可以b在打开时将其包含在控制模式中以完成此操作。对于套接字,您需要自己执行此操作。


推荐阅读