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
相关产品推荐
相关产品推荐

