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...)
安装开发版本:zip of latest dev github version然后解压并python setup.py install
(在 Linux 上使用 Sudo)
使用最新的 RadioTap 功能:
这是您可以使用最新开发版本的 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= ''
我正在尝试将负整数转换为可以放入 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...)
安装开发版本:zip of latest dev github version然后解压并
python setup.py install
(在 Linux 上使用 Sudo)使用最新的 RadioTap 功能:
这是您可以使用最新开发版本的 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= ''