我想使用tcl提供的udp包发送6字节十六进制的有效负载:“8000000004d2”。我能够发送它并在接收器上我能够读取相同的数据。但是在wireshark捕获中它显示了12个字节的有效载荷,因为它以ascii格式发送这些数据,如“38 30 30 30 30 30 30 30 31 32 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
答案 0 :(得分:3)
如果您有十六进制的有效负载,请在发送之前将其解码为字节数组:
# 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
没有{
,}
在解析之前会产生额外的一轮替换,这在语义上通常是错误的,并且总是对性能不利。)