擅长:python、mysql、java
<p>这个答案是关于Scapy 2.2.0的。在</p>
<p><code>LenField</code>s通常成对工作,如下所示:</p>
<pre><code>FieldLenField("len", None, length_of="data")
StrLenField("data", "", length_from=lambda pkt:pkt.len)
</code></pre>
<p>请注意<code>length_of</code>和<code>length_from</code>如何将这两个字段链接在一起。<code>length_of</code>值告诉Scapy在发送包时如何计算<code>"len"</code>字段(注意,默认值是<code>None</code>,表示应该自动计算)。当<cdy}将数据包分解成多个字节时,{/cdy}告诉这个字段。在</p>
<p>有一个名为<code>LenField</code>的特殊字段,它可以自己使用。再次注意,默认值是<code>None</code>,这意味着它应该自动计算。当<strong>发送</strong>时,Scapy将简单地计算<code>"len"</code>作为当前层之后的字节数。在</p>
^{pr2}$
<p>既然已经引入了长度字段,就可以使用Python将<code>StrLenField</code>的输出编码为十六进制。在</p>
<pre><code># In layer definition
BitFieldLenField("lenfield", None, 8, length_of="varfield")
StrLenField("varfield", "", length_from=lambda pkt:pkt.lenfield)
# In main script
print(pck[mylayer].varfield.encode("hex")) # Replace "mylayer" with the name of your new layer
</code></pre>