船首信标包的信号强度,负整数,二进制补码十六进制

时间:2018-07-13 19:11:30

标签: python hex scapy twos-complement negative-number

我正在尝试将负整数转换为二进制补码十六进制,可以将其放入signal_strength变量中的小包(贝洛)的十六进制代码中。

负数来自以下代码行:

    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)

但是它返回\ 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)

但是仅返回CA,由于ValueError我无法将\ x添加到其中:无效的\ x转义。 尝试添加\ x以获取数据包的正确格式时,我遇到了该错误:

    signal_strength = '\x' + signalstrength

2 个答案:

答案 0 :(得分:0)

这有帮助吗?

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

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

答案 1 :(得分:0)

我确切地知道您在做什么,您正尝试将无线电信号手动填充到notdecoded中,因为以前的Scapy版本中无法将其作为字段进行访问。

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

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

['TSFT',  “标志”,  '率',  '渠道',  “ FHSS”,  'dBm_AntSignal',  'dBm_AntNoise',  'Lock_Quality',  'TX_Attenuation',  'dB_TX_Attenuation',  'dBm_TX_Power',  '天线',  'dB_AntSignal',  'dB_AntNoise',  “ RXFlags”,  “ ChannelPlus”,  “ MCS”,  'A_MPDU',  'VHT',  “时间戳记”,  “ 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= ''