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}")
【python】网络数据包有效数据提取及进制转化
Python网络数据解析与转换
最新推荐文章于 2025-11-06 15:29:04 发布
2325

被折叠的 条评论
为什么被折叠?



