2

tcl が提供する udp パッケージを使用して、16 進 6 バイトのペイロード「8000000004d2」を送信したいと考えています。私はそれを送信でき、受信側のPCで同じデータを読み取ることができます。しかし、wireshark キャプチャでは、このデータを「38 30 30 30 30 30 30 30 31 32 33 34」のような ASCII 形式で送信するため、12 バイトのペイロードが表示されます。データが実際に 12 バイトとして送信されているのか、それとも Wireshark だけがそれを false と解釈しているのか、誰か教えてください。データが 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

16進数のペイロードがある場合は、送信する前にそれをバイト配列にデコードします。

# 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]

ただし、中間の16進表現を使用する理由はありません。最初からバイト配列を作成できます。

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

(注:を指定exprしない{と、}解析前に追加の置換ラウンドが生成されます。これは通常、意味的に間違っており、常にパフォーマンスに悪影響を及ぼします)。

于 2013-01-18T07:28:16.657 に答える