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

Python如何将Netlink套接字接收的数据以十六进制格式打印

你直接打印乱码是因为socket.recv()返回的是二进制字节序列,直接输出时系统会将字节按ASCII编码解析为字符,不可打印的控制字符就会显示为乱码,不需要先完整解包Netlink消息就可以直接转储打印原始字节。你之前写法出错是因为误将socket对象s当成了收到的数据变量data使用。

Python 3.5+ 最简方案

直接调用bytes类型内置的hex()方法即可快速生成十六进制字符串:

# 打印前64字节,每字节用空格分隔,小写十六进制
print(data[:64].hex(' '))

# 如需大写十六进制可以加参数
print(data[:64].hex(' ', upper=True))

兼容Python2/3的通用方案

使用标准库binascii的hexlify方法实现:

import binascii

# 取前64字节转十六进制原始字符串
raw_hex = binascii.hexlify(data[:64])
# 每两个字符插入空格分隔
formatted_hex = ' '.join([raw_hex[i:i+2] for i in range(0, len(raw_hex), 2)])
print(formatted_hex)

带对照格式的HexDump实现

如果需要类似抓包工具的带偏移量、ASCII对照的转储格式,可以用以下工具函数:

def hexdump(data, max_len=64):
    data = data[:max_len]
    for offset in range(0, len(data), 16):
        # 按16字节分块
        block = data[offset:offset+16]
        # 生成十六进制部分,补全宽度对齐
        hex_col = ' '.join([f"{b:02x}" for b in block]).ljust(48)
        # 生成ASCII可打印部分,不可见字符替换为.
        ascii_col = ''.join([chr(b) if 32 <= b <= 126 else '.' for b in block])
        print(f"{offset:08x}: {hex_col}  {ascii_col}")

# 调用示例
hexdump(data, 64)

如果你需要解析Netlink消息的具体字段内容,才需要按照Netlink协议的struct格式逐步解包对应位置的字节,单纯查看原始二进制内容直接对data变量处理即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:54:03