You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scapy UDP十六进制数据收发转义处理及解码问题求助

问题

使用Scapy发送UDP十六进制数据后,解码时遇到格式问题:发送的原始十六进制字符串为000ad74340b81e4941002900020202000200,但接收端获取到的负载是带双反斜杠转义的字符串"\\x00\\n\\xd7C@\\xb8\\x1eIA\\x00)\\x00\\x02\\x02\\x02\\x00\\x02\\x00",无法直接转回原始十六进制格式。

发送端代码如下:

from scapy.all import *
from scapy.layers.l2 import Ether
from scapy.layers.inet import IP, UDP

test_data = ["000ad74340b81e4941002900020202000200"]  # 实际从文件读取
source_ip = "192.168.1.12"
destination_ip = "192.168.1.4"
source_mac = "70:85:c2:f3:18:8e"
destination_mac = "80:ce:62:f2:94:22"
source_port = 5005
destination_port = 5005
tmp = []

byte_str = [(test_data[0][i:i + 2]) for i in range(0, len(test_data[0]), 2)]

for i in range(len(byte_str)):
    tmp.append(int(f"0x{byte_str[i]}", 16))

data_to_send = bytearray(tmp)
print("b'" + ''.join(f'\\x{c:02x}' for c in data_to_send) + "'")

pkt = Ether(dst=destination_mac, src=source_mac)/\
      IP(dst=destination_ip, src=source_ip, flags=2)/\
      UDP(dport=destination_port, sport=source_port)/data_to_send

del pkt[IP].chksum
del pkt[UDP].chksum

pkt.show2()
sendp(pkt)

发送的数据包负载显示为:

###[ Raw ]### 
           load      = '\x00\n\\xd7C@\\xb8\x1eIA\x00)\x00\x02\x02\x02\x00\x02\x00'

需求是将接收的带双反斜杠的字符串转换为正确的字节串b'\x00\n\xd7C@\xb8\x1eIA\x00)\x00\x02\x02\x02\x00\x02\x00',最终还原为原始十六进制字符串。

解决方案

方法1:使用ast.literal_eval解析转义字符串

Python的ast模块可以安全解析字符串形式的字节串,自动处理双反斜杠转义:

import ast

# 接收的带双反斜杠的字符串
received_str = "\\x00\\n\\xd7C@\\xb8\\x1eIA\\x00)\\x00\\x02\\x02\\x02\\x00\\x02\\x00"
# 包装成字节串字面量格式
byte_literal = f"b'{received_str}'"
# 解析得到正确的字节串
correct_bytes = ast.literal_eval(byte_literal)

# 还原为原始十六进制字符串
hex_str = ''.join(f'{b:02x}' for b in correct_bytes)
print(hex_str)  # 输出:000ad74340b81e4941002900020202000200

方法2:直接从Scapy数据包读取原始字节

如果接收端用Scapy抓包,不要读取负载的字符串表示,直接获取Raw层的load属性(本身就是字节类型):

# 假设接收到的数据包为pkt
received_data = pkt[Raw].load
# 直接转换为十六进制字符串
hex_str = received_data.hex()
print(hex_str)  # 输出原始十六进制字符串

方法3:手动处理转义字符(不推荐,易出错)

若必须处理字符串形式的转义内容,可通过编码转换实现:

received_str = "\\x00\\n\\xd7C@\\xb8\\x1eIA\\x00)\\x00\\x02\\x02\\x02\\x00\\x02\\x00"
# 先解码unicode转义,再编码为字节
correct_bytes = received_str.encode('utf-8').decode('unicode_escape').encode('latin-1')

内容的提问来源于stack exchange,提问作者B3st0fth3w0rst

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:20:36