当前位置: 首页 > wzjs >正文

h5 和手机网站网上购物正品网站

h5 和手机网站,网上购物正品网站,wordpress音乐主题pulse,国家企业信用系统查询官网入口C#合并CAN ASC文件:实现与优化 在汽车电子和工业控制领域,CAN(Controller Area Network)总线是一种广泛使用的通信协议。CAN ASC(American Standard Code)文件则是记录CAN总线通信数据的标准格式&#xff…

C#合并CAN ASC文件:实现与优化

在汽车电子和工业控制领域,CAN(Controller Area Network)总线是一种广泛使用的通信协议。CAN ASC(American Standard Code)文件则是记录CAN总线通信数据的标准格式,常用于数据分析和故障排查。当需要处理多个时间段的CAN数据时,合并多个ASC文件就成为了必要操作。本文将介绍如何使用C#实现CAN ASC文件的合并功能。

一、ASC文件格式简介

CAN ASC文件通常包含以下部分:

  • 文件头部:包含日期、时间戳类型等信息
  • 数据记录:每条记录包含时间戳、CAN ID、数据长度和数据内容

一个典型的ASC文件示例:

date Wed May 29 10:30:00 am 2025
base hex  timestamps absolute0.000000 123             Tx   d 8 01 02 03 04 05 06 07 08  Channel: 11.500000 456             Rx   d 8 11 12 13 14 15 16 17 18  Channel: 1

二、合并CAN ASC文件的挑战

合并多个ASC文件看似简单,但实际上需要考虑以下几个关键问题:

    1. 时间戳处理:如何将不同文件中的相对时间戳合并为统一的时间线
    1. 文件顺序:按什么顺序合并文件才能保证时间连续性
    1. 数据一致性:合并后的数据行数是否正确
    1. 重复合并检查:避免重复合并相同的文件

三、C#实现CAN ASC文件合并器

下面是一个完整的C#实现,它能够处理多个ASC文件的合并,并解决上述挑战:

/// <summary>
/// 报文合并
/// </summary>
public class AscMerger
{/// <summary>/// 源文件夹路径,存储需要合并的 ASC 文件/// </summary>private readonly string sourcePath;/// <summary>/// 目标文件夹路径,用于存储合并后的 ASC 文件/// </summary>private readonly string destinationPath;public AscMerger(string sourcePath, string destinationPath){// 设置源文件夹路径this.sourcePath = sourcePath;// 设置目标文件夹路径this.destinationPath = destinationPath;}public (string filePath, ErrorCode errorCode) Merge(){try{if (!Directory.Exists(this.sourcePath)){return ("", ErrorCode.SourceFolderNotFound);}if (!Directory.Exists(this.destinationPath)){return ("", ErrorCode.DestinationFolderNotFound);}var files = this.GetFiles();if (!files.Any()){return ("", ErrorCode.AscFilesNotFound);}var messages = files.Select(f => this.ReadFile(f)).ToList();var headerTime = this.CalculateHeaderTime(messages);var headerTimestamp = ToTimestamp(headerTime);var combinedMessages = this.CombineMessages(messages, headerTimestamp);// 验证文件已存在var targetName = $"{this.ToFileString(headerTime)}.asc";if (files.Any(f => f.Name == targetName)){return ("", ErrorCode.AlreadyMerged);}// 验证行数var lineCount = messages.Select(m => m.Skip(2).Count()).Sum();if (lineCount != combinedMessages.Count){return ("", ErrorCode.Inconsistent);}// 保存var target = Path.Combine(this.destinationPath, targetName);if (!this.SaveDestinationFile(headerTime, combinedMessages, target)){return ("", ErrorCode.FileWriteError);}return (target, ErrorCode.None);}catch (Exception e){Console.WriteLine($"{e.Message}\r\n{e.StackTrace}");return ("", ErrorCode.FileReadError);}}private List<FileInfo> GetFiles(){return new DirectoryInfo(this.sourcePath).GetFiles("*.asc").ToList();}private List<string> ReadFile(FileInfo f){using (var sr = new StreamReader(f.FullName)){var list = new List<string>();var content = "";while (!string.IsNullOrWhiteSpace((content = sr.ReadLine()))){list.Add(content);}return list;}}private DateTime CalculateHeaderTime(List<List<string>> messages){return messages.Where(m => m.Any()).Select(m => m.Take(1).First()).Select(m => this.FromCanHeaderString(m)).Min();}private DateTime FromCanHeaderString(string s){s = s.Replace("date ", "").Replace("am", "AM").Replace("pm", "PM");var format = "ddd MMM dd hh:mm:ss tt yyyy";var culture = CultureInfo.CreateSpecificCulture("en-US");return DateTime.ParseExact(s, format, culture);}private double ToTimestamp(DateTime d){if (d == DateTime.MinValue){return 0;}return new DateTimeOffset(d).ToUnixTimeMilliseconds() / 1000.0;}private List<string> CombineMessages(List<List<string>> messages, double headerTimestamp){return (from dict infrom m in messagesselect this.CalculateTimestamp(m)from kp in dictorderby kp.Item1select this.ReplaceTimestamp(kp.Item2, headerTimestamp, kp.Item1)).ToList();}private List<(double, string)> CalculateTimestamp(List<string> messages){if (messages == null || messages.Count < 2){return new List<(double, string)>();}var header = messages.Take(2).ToList();var time = this.FromCanHeaderString(header[0]);var timestamp = ToTimestamp(time);return messages.Skip(2).Select(m => (this.ExtractTimestamp(m), m)).Select(m => (timestamp + m.Item1, m.Item2)).ToList();}private double ExtractTimestamp(string s){var reg = new Regex("^\\d{1,}.\\d{6}");var match = reg.Match(s);return double.Parse(match.Value);}private string ReplaceTimestamp(string s, double baseTimestamp, double timestamp){return Regex.Replace(s, "^\\d{1,}.\\d{6}", (timestamp - baseTimestamp).ToString("0.000000"));}private bool SaveDestinationFile(DateTime headerTime, List<string> messages, string path){using (var sw = new StreamWriter(path)){sw.WriteLine($"date {this.ToCanHeaderString(headerTime)}");sw.WriteLine("base hex timestamps absolute");sw.Flush();foreach (var m in messages){sw.WriteLine(m);}return true;}}private string ToFileString(DateTime time){return $"{time:yyyyMMdd_HHmmss}";}public string ToCanHeaderString(DateTime d){var format = "ddd MMM dd hh:mm:ss tt yyyy";var culture = CultureInfo.CreateSpecificCulture("en-US");return d.ToString(format, culture).Replace("AM", "am").Replace("PM", "pm");}
}public enum ErrorCode
{None = 0,SourceFolderNotFound = 1,DestinationFolderNotFound = 2,AscFilesNotFound = 3,FileReadError = 4,FileWriteError = 5,Inconsistent = 6,AlreadyMerged = 7
}

四、代码解析

这个ASC文件合并器主要包含以下几个核心功能:

    1. 初始化与路径验证:通过构造函数接收源文件夹和目标文件夹路径,并在合并前验证这些路径是否存在。
    1. 文件读取ReadFile方法负责读取单个ASC文件的内容,将其存储为字符串列表。
    1. 时间戳处理
    • CalculateHeaderTime方法确定所有文件中最早的时间戳
    • ExtractTimestamp方法从每条记录中提取相对时间戳
    • ReplaceTimestamp方法将所有时间戳转换为相对于合并后文件开始时间的相对时间
    1. 文件合并CombineMessages方法将所有文件的内容按时间顺序合并,并处理时间戳转换。
    1. 数据验证:在合并前后进行数据验证,确保合并过程中没有数据丢失。
    1. 错误处理:使用枚举类型ErrorCode处理各种可能的错误情况,确保程序的健壮性。

五、使用示例

下面是如何使用这个合并器的简单示例:

static void Main(string[] args)
{string sourcePath = @"C:\CAN\Source";string destinationPath = @"C:\CAN\Destination";var merger = new AscMerger(sourcePath, destinationPath);var result = merger.Merge();if (result.errorCode == ErrorCode.None){Console.WriteLine($"合并成功!文件保存至: {result.filePath}");}else{Console.WriteLine($"合并失败!错误码: {result.errorCode}");}
}

六、性能优化建议

对于处理大量或大型ASC文件的情况,可以考虑以下优化:

  1. 使用并行处理来加速文件读取
  2. 实现流式处理,避免将整个文件加载到内存中
  3. 添加进度报告功能,让用户了解合并进度
  4. 增加文件过滤功能,只合并特定时间段的文件

通过这种方式实现的CAN ASC文件合并器,不仅能够正确处理时间戳问题,还提供了完善的错误处理机制,确保合并过程的可靠性和数据的完整性。无论是用于汽车诊断、工业自动化还是其他CAN总线应用场景,这个工具都能帮助工程师更高效地处理和分析CAN数据。


文章转载自:

http://Zp0wYLoQ.Ltffk.cn
http://A6aZeyhm.Ltffk.cn
http://WikyybAU.Ltffk.cn
http://uRIql6Mk.Ltffk.cn
http://ChJzJrci.Ltffk.cn
http://JZlhQIIZ.Ltffk.cn
http://X9bQj9JD.Ltffk.cn
http://Y6QDp3A4.Ltffk.cn
http://N0QhljdK.Ltffk.cn
http://6lLfUzdd.Ltffk.cn
http://cYTHRfdz.Ltffk.cn
http://SrNZrlAY.Ltffk.cn
http://hvP9STfa.Ltffk.cn
http://AEgwvlP0.Ltffk.cn
http://TclcM67z.Ltffk.cn
http://ABZr8Oxe.Ltffk.cn
http://cbr1NNZs.Ltffk.cn
http://KyhAQLJF.Ltffk.cn
http://ekV7gx7w.Ltffk.cn
http://krXodroQ.Ltffk.cn
http://MsmAfkkW.Ltffk.cn
http://NOebCsAw.Ltffk.cn
http://IIOTD3p9.Ltffk.cn
http://hN3i0HCd.Ltffk.cn
http://wHazfu4U.Ltffk.cn
http://wGXY7ZaB.Ltffk.cn
http://Qv5LpcDx.Ltffk.cn
http://WPnySWDX.Ltffk.cn
http://b3uKXRKU.Ltffk.cn
http://ML1ilOI3.Ltffk.cn
http://www.dtcms.com/wzjs/611939.html

相关文章:

  • 网站换域名要怎么做女程序员可以干到多少岁
  • 奇迹网站架设视频如何自己设计广告图
  • 深圳服务网站入口房产网站内容建设部门规划
  • 网站标题logo怎么做建设网站需要注意的事项
  • c2c代表网站江门找做公众号的网站
  • 非凡网站建设 新三板怎么做自己的彩票网站
  • 网站实名认证深圳商城软件开发
  • 手机网站开发软件迎访问中国建设银行网站_
  • 网站建设是前端后端吗关键词优化需要注意
  • wordpress不要在前端显示标签西宁网站建设优化
  • 网上花钱做ppt的网站做简单的网站
  • 怎样做企业网站建设ftp制作网站
  • 网站建设公司怎么推广优化大师最新版本
  • 国内网站如何做流量免费做微信小程序
  • 怀化平台济南网站建设优化
  • 一键建站免费如何做天猫网站
  • 服饰网站建设模板易语言建设网站
  • 扬州住房与城乡建设局网站做网盟行业网站的图片广告的销售
  • 中国建设银行网站企业网银收费长春企业网站制作优化
  • 专门做评测的网站中企动力做的网站价格区间
  • 建设外贸网站哪家好wordpress构建自定义设置页面
  • 简单的工作室网站模板seo静态页源码
  • 网站设计方案案例分析建筑行业资讯网站
  • 哪里有响应式网站企业企业只有建立自己的网站
  • 克拉玛依建设局网站eclipse网站开发实例
  • 慕课联盟网站开发实战越秀金融大厦地址
  • 网站建设的考虑网店装修素材
  • 淘宝网站店铺请人做柳州网站建站费用
  • 常州网站建设技术托管遵义今天查出新冠
  • 网站 工作室前台和后台网站开发的区别