如何利用EXCEL解析16进制字符串

例如有一串16进制字符串:0x7edf113dcadb923aafe

可以用EXCEL里面的LEFT,RIGHT,HEX2BIN,&几个组合在一起截取上述16进制字符串中任意比特序列。

举例如下:

$A$1表示字符串所在的单元格绝对引用。

取左边起3个字符串:LEFT($A$1,3)

取右边起2个字符串:RIGHT($A$1,2)

取中间的第7个字符:MID($A$1,7,1) 起始位置从1开始计数,'7' 就是第一个字符,往左边数。

取中间的第8个字符的高4bit:LEFT(HEX2BIN(MID($A$1,8,1),8),4)

LEFT函数从左边开始计数,

RIGHT函数从右边开始计数,

HEX2BIN:将16进制字符串转换成2进制字符串,最多能表示10bit的2进制数字符串。超过10bit的怎么办?

可以用&连接号拼接。

例如:MID(HEX2BIN(LEFT($A$1,2),8),6,3) & MID(HEX2BIN(MID($A$1,5,1),4),1,2)

表示取16进制字符串的坐起2个字符组成的8比特数的低3bit和左起第5个16进制字符组成的4bit二进制数的高2bit组成新的一串2进制字符串。

超级链接公式:IF(H7<>"",HYPERLINK((INDEX(Sheet1!$A$2:$C$7,MATCH(J7,Sheet1!$A$2:$A$7,0),2)),F7),"")

表示根据区域$A$2到$A$7范围内查找到和J7单元格内容相同的哪行所在的区域的第二列内容作为超级链接HYPERLINK的定位路径,这个路径是另外一个文件的所在磁盘位置。


如果对字段比特有特殊解释,那么可以再另外的空格里面插入超链接,链接到解释文档。具体应用的公式例如
IF(E2<>"",HYPERLINK(INDEX())) 等,查找所在的文档的索引,并且跳转到所在文档。

MATCH函数:匹配某个单元格内容与某块数据区域是否匹配,可以输出不同结果。




好的,我来给你写一份 C# 调用 NPOI 库来解析 DBC 并生成 Excel 的代码。在开始之前,我们需要先安装 NPOI 库,可以通过 NuGet 包管理器进行安装。 接下来,我们需要引入 NPOI 库和 System.IO 库,在代码开头添加以下引用: ``` using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System.IO; ``` 然后,我们需要定义一个方法,用于解析 DBC 文件并生成 Excel 文件。代码如下: ``` public static void GenerateExcelFromDBC(string dbcFilePath, string excelFilePath) { // 判断 DBC 文件是否存在 if (!File.Exists(dbcFilePath)) { throw new Exception("DBC 文件不存在!"); } // 创建 Excel 文件 IWorkbook workbook = null; FileStream fileStream = null; if (File.Exists(excelFilePath)) { fileStream = new FileStream(excelFilePath, FileMode.Open, FileAccess.ReadWrite); if (Path.GetExtension(excelFilePath).Equals(".xls")) { workbook = new HSSFWorkbook(fileStream); } else if (Path.GetExtension(excelFilePath).Equals(".xlsx")) { workbook = new XSSFWorkbook(fileStream); } else { throw new Exception("不支持的 Excel 文件格式!"); } } else { if (Path.GetExtension(excelFilePath).Equals(".xls")) { workbook = new HSSFWorkbook(); } else if (Path.GetExtension(excelFilePath).Equals(".xlsx")) { workbook = new XSSFWorkbook(); } else { throw new Exception("不支持的 Excel 文件格式!"); } } // 读取 DBC 文件 using (FileStream dbcStream = new FileStream(dbcFilePath, FileMode.Open, FileAccess.Read)) { BinaryReader reader = new BinaryReader(dbcStream); // 解析 DBC 文件头 int signature = reader.ReadInt32(); int recordCount = reader.ReadInt32(); int fieldCount = reader.ReadInt32(); int recordSize = reader.ReadInt32(); // 解析 DBC 字段信息 List<string> fieldNames = new List<string>(); List<Type> fieldTypes = new List<Type>(); for (int i = 0; i < fieldCount; i++) { byte[] fieldNameBytes = reader.ReadBytes(4); string fieldName = Encoding.UTF8.GetString(fieldNameBytes); byte fieldTypeByte = reader.ReadByte(); Type fieldType = GetFieldType(fieldTypeByte); fieldNames.Add(fieldName); fieldTypes.Add(fieldType); } // 创建 Excel 工作 ISheet sheet = workbook.CreateSheet(Path.GetFileNameWithoutExtension(dbcFilePath)); // 创建 Excel 头 IRow headerRow = sheet.CreateRow(0); for (int i = 0; i < fieldNames.Count; i++) { ICell cell = headerRow.CreateCell(i); cell.SetCellValue(fieldNames[i]); } // 解析 DBC 记录并写入 Excel 格 for (int i = 0; i < recordCount; i++) { IRow row = sheet.CreateRow(i + 1); byte[] recordData = reader.ReadBytes(recordSize); int index = 0; for (int j = 0; j < fieldCount; j++) { object value = GetFieldValue(recordData, index, fieldTypes[j]); ICell cell = row.CreateCell(j); if (value != null) { cell.SetCellValue(value.ToString()); } index += GetFieldSize(fieldTypes[j]); } } reader.Close(); } // 保存 Excel 文件 if (fileStream != null) { fileStream.Close(); } else { fileStream = new FileStream(excelFilePath, FileMode.Create, FileAccess.Write); } workbook.Write(fileStream); fileStream.Close(); } // 获取 DBC 字段类型对应的 .NET 类型 private static Type GetFieldType(byte fieldTypeByte) { switch (fieldTypeByte) { case 0: return typeof(int); case 1: return typeof(float); case 2: return typeof(string); default: throw new Exception("不支持的 DBC 字段类型!"); } } // 获取 DBC 字段类型对应的大小 private static int GetFieldSize(Type fieldType) { if (fieldType == typeof(int)) { return 4; } else if (fieldType == typeof(float)) { return 4; } else if (fieldType == typeof(string)) { return 4; } else { throw new Exception("不支持的 .NET 类型!"); } } // 获取 DBC 记录中指定字段的值 private static object GetFieldValue(byte[] recordData, int index, Type fieldType) { if (fieldType == typeof(int)) { return BitConverter.ToInt32(recordData, index); } else if (fieldType == typeof(float)) { return BitConverter.ToSingle(recordData, index); } else if (fieldType == typeof(string)) { int stringOffset = BitConverter.ToInt32(recordData, index); if (stringOffset == 0) { return null; } else { int length = Array.IndexOf<byte>(recordData, 0, stringOffset) - stringOffset; return Encoding.UTF8.GetString(recordData, stringOffset, length); } } else { throw new Exception("不支持的 .NET 类型!"); } } ``` 现在,我们来逐行解释一下上面的代码: 1. `public static void GenerateExcelFromDBC(string dbcFilePath, string excelFilePath)`:这是一个公共静态方法,用于解析 DBC 文件并生成 Excel 文件。该方法接受两个参数:DBC 文件路径和 Excel 文件路径。 2. `if (!File.Exists(dbcFilePath))`:判断 DBC 文件是否存在,如果不存在则抛出异常。 3. `IWorkbook workbook = null;`:创建一个空的 Excel 工作簿。 4. `FileStream fileStream = null;`:创建一个空的文件流。 5. `if (File.Exists(excelFilePath))`:判断 Excel 文件是否存在,如果存在则打开文件流,并根据文件扩展名创建对应的 Excel 工作簿。 6. `else`:如果 Excel 文件不存在,则根据文件扩展名创建对应的 Excel 工作簿。 7. `using (FileStream dbcStream = new FileStream(dbcFilePath, FileMode.Open, FileAccess.Read))`:使用 using 语句打开 DBC 文件流,确保在使用完成后自动释放资源。 8. `BinaryReader reader = new BinaryReader(dbcStream);`:创建一个二进制读取器,用于读取 DBC 文件的二进制数据。 9. `int signature = reader.ReadInt32();`:读取 DBC 文件头的签名,判断文件是否为有效的 DBC 文件。 10. `int recordCount = reader.ReadInt32();`:读取 DBC 文件头中的记录数量。 11. `int fieldCount = reader.ReadInt32();`:读取 DBC 文件头中的字段数量。 12. `int recordSize = reader.ReadInt32();`:读取 DBC 文件头中的记录大小。 13. `List<string> fieldNames = new List<string>();`:创建一个字符串,用于存储 DBC 字段的名称。 14. `List<Type> fieldTypes = new List<Type>();`:创建一个类型列,用于存储 DBC 字段的类型。 15. `for (int i = 0; i < fieldCount; i++)`:循环读取 DBC 字段信息。 16. `byte[] fieldNameBytes = reader.ReadBytes(4);`:读取 DBC 字段名的字节数组。 17. `string fieldName = Encoding.UTF8.GetString(fieldNameBytes);`:将字节数组转换为字符串。 18. `byte fieldTypeByte = reader.ReadByte();`:读取 DBC 字段类型的字节。 19. `Type fieldType = GetFieldType(fieldTypeByte);`:根据 DBC 字段类型的字节获取对应的 .NET 类型。 20. `fieldNames.Add(fieldName);`:将 DBC 字段名添加到列中。 21. `fieldTypes.Add(fieldType);`:将 DBC 字段类型添加到列中。 22. `ISheet sheet = workbook.CreateSheet(Path.GetFileNameWithoutExtension(dbcFilePath));`:创建一个新的 Excel 工作,并使用 DBC 文件名作为格名称。 23. `IRow headerRow = sheet.CreateRow(0);`:创建 Excel 头行。 24. `for (int i = 0; i < fieldNames.Count; i++)`:循环创建 Excel 头单元格。 25. `ICell cell = headerRow.CreateCell(i);`:创建 Excel 头单元格。 26. `cell.SetCellValue(fieldNames[i]);`:将 DBC 字段名设置为单元格的值。 27. `for (int i = 0; i < recordCount; i++)`:循环读取 DBC 记录并写入 Excel 格。 28. `IRow row = sheet.CreateRow(i + 1);`:创建 Excel 行。 29. `byte[] recordData = reader.ReadBytes(recordSize);`:读取 DBC 记录的二进制数据。 30. `int index = 0;`:初始化索引值。 31. `for (int j = 0; j < fieldCount; j++)`:循环读取 DBC 记录中的字段并写入 Excel 单元格。 32. `object value = GetFieldValue(recordData, index, fieldTypes[j]);`:根据字段类型获取字段值。 33. `ICell cell = row.CreateCell(j);`:创建 Excel 单元格。 34. `if (value != null)`:判断字段值是否为空。 35. `cell.SetCellValue(value.ToString());`:将字段值设置为单元格的值。 36. `index += GetFieldSize(fieldTypes[j]);`:增加索引值。 37. `reader.Close();`:关闭二进制读取器。 38. `if (fileStream != null)`:判断文件流是否为空。 39. `fileStream.Close();`:关闭文件流。 40. `else`:如果文件流为空,则创建一个新的文件流并保存 Excel 文件。 41. `workbook.Write(fileStream);`:将 Excel 工作簿写入文件流。 42. `fileStream.Close();`:关闭文件流。 至此,我们已经完成了 C# 调用 NPOI 库来解析 DBC 并生成 Excel 的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值