【python】网络数据包有效数据提取及进制转化

Python网络数据解析与转换
import pandas as pd

# 读取CSV文件
df = pd.read_csv('waveform.csv')

# 提取指定列
mac_rx_data = df['design_1_i/Eth_Mac_v1_0_2/U0/Eth_Mac_v1_0_S_AXI_inst/MAC_inst/MAC_RX_DATA[7:0]']
mac_rx_data_valid = df['design_1_i/Eth_Mac_v1_0_2/U0/Eth_Mac_v1_0_S_AXI_inst/MAC_inst/MAC_RX_DATA_VALID']

# 只保留MAC_RX_DATA_VALID为1的数据
valid_data = mac_rx_data[mac_rx_data_valid == 1]

# 调试前20个有问题的数据
print("调试有问题的数据:")
for i in range(min(20, len(valid_data))):
    original = valid_data.iloc[i]
    print(f"索引 {valid_data.index[i]}: '{original}' (长度: {len(str(original))})")

# 修正的转换函数 - 处理各种可能的格式
def robust_binary_to_hex(data_value):
    """健壮的二进制转十六进制函数"""
    try:
        data_str = str(data_value).strip()
        
        # 情况1: 已经是8位二进制 (如 '10101010')
        if len(data_str) == 8 and all(c in '01' for c in data_str):
            return hex(int(data_str, 2))[2:].upper().zfill(2)
        
        # 情况2: 包含在长字符串中的8位二进制
        # 查找连续的8个0或1字符
        import re
        binary_patterns = re.findall(r'[01]{8}', data_str)
        if binary_patterns:
            # 取最后一个8位模式(通常是最新的数据)
            binary_clean = binary_patterns[-1]
            return hex(int(binary_clean, 2))[2:].upper().zfill(2)
        
        # 情况3: 如果字符串看起来像数字,尝试直接转换
        if data_str.isdigit():
            # 可能是十进制表示的字节值
            decimal_val = int(data_str)
            if 0 <= decimal_val <= 255:
                return hex(decimal_val)[2:].upper().zfill(2)
        
        # 情况4: 如果长度小于8,前面补0
        if len(data_str) < 8 and all(c in '01' for c in data_str):
            padded = data_str.zfill(8)
            return hex(int(padded, 2))[2:].upper().zfill(2)
            
        # 如果都无法转换,返回原始值用于分析
        return f"RAW:{data_str}"
        
    except Exception as e:
        return f"ERROR:{e}"

# 应用修正的转换
print("\n应用修正转换:")
hex_data_robust = valid_data.apply(robust_binary_to_hex)

# 检查转换结果
error_count = hex_data_robust.str.startswith(('ERROR', 'RAW')).sum()
success_count = len(hex_data_robust) - error_count

print(f"\n转换统计:")
print(f"成功转换: {success_count} 个")
print(f"转换失败: {error_count} 个")

# 显示有问题的数据
if error_count > 0:
    print(f"\n有问题的数据样本:")
    error_indices = hex_data_robust[hex_data_robust.str.startswith(('ERROR', 'RAW'))].index
    for idx in error_indices[:10]:
        original = valid_data.loc[idx]
        result = hex_data_robust.loc[idx]
        print(f"行 {idx}: '{original}' -> {result}")

# 创建最终的DataFrame
final_data = pd.DataFrame({
    'Original_Index': valid_data.index,
    'Sample_in_Window': df.loc[valid_data.index, 'Sample in Window'],
    'Original_Data': valid_data.values,
    'Hex_Value': hex_data_robust.values,
    'Status': ['成功' if not x.startswith(('ERROR', 'RAW')) else '失败' for x in hex_data_robust]
})

# 保存到CSV
output_filename = 'mac_rx_data_hex_fixed.csv'
final_data.to_csv(output_filename, index=False)
print(f"\n数据已保存到: {output_filename}")

# 只保存成功转换的数据
successful_data = final_data[final_data['Status'] == '成功']
if len(successful_data) > 0:
    clean_output = 'mac_rx_data_hex_clean.csv'
    successful_data[['Original_Index', 'Sample_in_Window', 'Hex_Value']].to_csv(clean_output, index=False)
    print(f"纯净数据已保存到: {clean_output}")
    
    # 打印成功转换的数据预览
    print(f"\n成功转换的前20个十六进制字节:")
    hex_values_clean = successful_data['Hex_Value'].head(20).tolist()
    print(' '.join(hex_values_clean))
else:
    print("没有成功转换的数据!")

# 保存为纯十六进制序列
if len(successful_data) > 0:
    sequence_data = pd.DataFrame({
        'Byte_Position': range(1, len(successful_data) + 1),
        'Hex_Value': successful_data['Hex_Value'].values
    })
    sequence_filename = 'hex_sequence_clean.csv'
    sequence_data.to_csv(sequence_filename, index=False)
    print(f"十六进制序列已保存到: {sequence_filename}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值