2

我想使用 tcl 提供的 udp 包发送 6 字节十六进制的有效负载:“8000000004d2”。我能够发送它,并且在接收器 pc 上我能够读取相同的数据。但在 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
4

1 回答 1

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没有{,}在解析之前会产生一轮额外的替换,这在语义上通常是错误的,并且总是不利于性能)。

于 2013-01-18T07:28:16.657 回答