如何使用tcl udp包发送有效负载

如何使用tcl udp包发送有效负载,tcl,Tcl,我想使用tcl提供的udp包发送6字节十六进制的有效负载:“80000004D2”。我可以发送它,在接收pc上我可以读取相同的数据。但在wireshark捕获中,它显示了12个字节的有效负载,因为它以ascii格式发送数据,如“3830 30 31 33 34”。有谁能告诉我,数据真的是以12字节的形式传输的,还是只有Wireshark将其解释为错误的。如果数据以12字节的形式传输,有谁能帮助我仅使用tcl udp包以6字节的形式发送数据。作为参考,我给出了udp发送方代码 UDP发送方代码:

我想使用tcl提供的udp包发送6字节十六进制的有效负载:“80000004D2”。我可以发送它,在接收pc上我可以读取相同的数据。但在wireshark捕获中,它显示了12个字节的有效负载,因为它以ascii格式发送数据,如“3830 30 31 33 34”。有谁能告诉我,数据真的是以12字节的形式传输的,还是只有Wireshark将其解释为错误的。如果数据以12字节的形式传输,有谁能帮助我仅使用tcl udp包以6字节的形式发送数据。作为参考,我给出了udp发送方代码

UDP发送方代码:

namespace eval soc {

variable s
}

set soc::s [udp_open]
udp_conf $soc::s $IP_ADDR_RX  $UDP_PORT
fconfigure $soc::s -buffering none -translation binary

set data 1234
append hex [ format %04X [ expr $i | 0x8000 ] ]
append hex [ format %08X [ expr $data ] ]
puts -nonewline $soc::s $hex

如果您有十六进制的有效负载,请在发送之前将其解码为字节数组:

# For tcl 8.5 and below
puts -nonewline $soc::s [binary format H* $hex]
# For tcl 8.6 and above
puts -nonewline $soc::s [binary decode hex $hex]
但没有理由使用中间十六进制表示法:您可以从一开始就创建字节数组

set bytes [binary format SI [expr {$i|0x8000}] $data]
puts -nonewline $soc::s $bytes

(注意:
expr
没有
{
}
在解析之前会产生额外的一轮替换,这通常在语义上是错误的,并且对性能总是有害的)。

谢谢您的回复。我想你已经解决了我的问题。谢谢你的额外建议。非常感谢。Tcl可以很好地处理二进制数据——它只是一个包含字节的字符串——并且自Tcl 8.0以来就一直如此。