如何解决用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
包含在控制模式下,以完成此操作。对于套接字,您需要自己执行此操作。
除了配置二进制编码外,还需要将转换设置为“ lf”。由于这是一种经常发生的情况,因此可以进行以下两种设置:
fconfigure $Socket -translation binary
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。