#python #sockets #byte #scapy
#python #сокеты #байт #scapy
Вопрос:
У меня есть 2 программы, взаимодействующие друг с другом через Ethernet. Отправка одного из них использует scapy для кодирования порта, IP и полезной нагрузки перед отправкой в виде фрейма Ethernet. Моя проблема в том, что в полезной нагрузке я отправляю счетчик, и при получении он иногда меняется на symbol.
x00x00x00x00x00x00x00x07
x00x00x00x00x00x00x00x08 is fine but next
x00x00x00x00x00x00x00t
x00x00x00x00x00x00x00n
x00x00x00x00x00x00x00x0b its fine again
позже они будут изменены на следующие символы asci
Мой вопрос в том, как прекратить преобразование байтов в asci?
sender.py
import socket
from scapy.all import *
PADDING_VALUE = b'xd1'
ETH_P_ALL = 3
DST_IP = "127.0.0.12"
IFACE = "lo"
SRC_IP = "127.0.0.11"
class FpgaMockup:
def __init__(self, setup_iface):
self.setup_sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(ETH_P_ALL))
self.setup_sock.bind((setup_iface, 0))
self.padding = 16
def send(self, pkt):
self.setup_sock.send(pkt)
if __name__ == "__main__":
testing_fpga = FpgaMockup(IFACE)
for i in range(100):
packet = IP(dst=DST_IP, src=SRC_IP)/UDP(sport=12666, dport=12666)/Raw(load=int(i).to_bytes(8, "big") PADDING_VALUE*testing_fpga.padding)
pkt = Ether(packet)
testing_fpga.send(raw(pkt))
print("Finished sending.")
reciever.py
import socket
ETH_P_ALL = 3
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(ETH_P_ALL))
s.bind(("lo", 0))
while(True):
pkt = s.recv(4096)
print(pkt)
Ответ №1:
Они не «изменены». x09
точно такой же, как t
, x0a
такой же, как n
. Они просто печатаются по-разному, но, тем не менее, одинаковы:
>>> print(b'x08x09x0ax0b')
b'x08tnx0b'
>>> b'x08x09x0ax0b' == b'x08tnx0b'
True
Для получения дополнительной информации см. Документацию к синтаксису строковых и байтовых литералов.
Если вы не хотите вести этот разговор, просто примените запись в виде шестнадцатеричной последовательности вместо символов:
>>> b'x08tnx0b'.hex()
'08090a0b'