Символы изменения исходного сокета Python

#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'