scapy beacon数据包信号强度,负整数转十六进制补码

Signal strength for scapy beacon packet, negative Integer to two's complement hex

我正在尝试将负整数转换为可以放入 signal_strength 变量中的 scapy 数据包(波纹管)的十六进制代码中的二进制补码十六进制代码。

负数来自这行代码:

    sigstren = int(-1*(20*math.log10(distance) + 20*math.log10(frequency) - 37.55))

一个例子数字是-54,它的十六进制补码是FFCA,但是我需要它的格式是\xca。

RadioTap(len=18, present='Flags+Rate+Channel+dBm_AntSignal+Antenna', notdecoded='\x00\x6c' +  get_frequency(CHANNEL) + '\xc0\x00' + signal_strength + '\x01\x00\x00')

我试过这个:

    signal_string = struct.pack("<h", signal)

但它 returns \xca\xff 对于数据包来说太大了。

我也试过这个:

    def int_to_hex_string(value, bits):
        return "{0:0{1}X}".format(value & ((1<<bits) - 1), bits//4)
    signalstrength = int_to_hex_string(sigstren, 8)

但只有 returns CA,我无法将 \x 添加到其中,因为 ValueError: invalid \x escape。 我在尝试添加 \x 以获得数据包的正确格式时收到该错误:

    signal_strength = '\x' + signalstrength

这有什么帮助吗?

>>> hex(0x100 - 0x54)
'0xac'

你只需翻转半个字节并将 0 更改为 \

我很清楚你在做什么,你正试图将无线电信号手动填充到 notdecoded,因为它在以前的 scapy 版本中无法作为字段访问。

请注意,scapy 的最新开发版本现在允许您直接访问这些字段。自己做比较复杂(还需要考虑每个字段的padding...)

这是您可以使用最新开发版本的 scapy 设置的字段列表

['TSFT', 'Flags', 'Rate', 'Channel', 'FHSS', 'dBm_AntSignal', 'dBm_AntNoise', 'Lock_Quality', 'TX_Attenuation', 'dB_TX_Attenuation', 'dBm_TX_Power', 'Antenna', 'dB_AntSignal', 'dB_AntNoise', 'RXFlags', 'ChannelPlus', 'MCS', 'A_MPDU', 'VHT', 'timestamp', 'RadiotapNS', 'VendorNS', 'Ext']

这是你应该做的

RadioTap(len=18, present='Flags+Rate+Channel+dBm_AntSignal+Antenna',
    dBm_AntSignal=-54,
    Antenna=0x1)

有效:

###[ RadioTap dummy ]### 
  version= 0
  pad= 0
  len= 18
  present= Flags+Rate+Channel+dBm_AntSignal+Antenna
  Flags= 
  Rate= 0
  Channel= 0
  ChannelFlags= 
  dBm_AntSignal= -54dBm
  Antenna= 1
  notdecoded= ''