问题分析

1
2
3
4
# 问题代码

self.digital_bytes = (self.digital_count + 7) // 8
self.frame_size = 8 + self.analog_count * 2 + self.digital_bytes

问题代码按8位边界对齐,每8个数字通道占用1字节。这种算法符合IEEE C37.111标准,但是会出现一个问题,digital_bytes的结果会与数字通道的数量相关,例如当数字通道数量为8个时,该算法分配的字节数digital_bytes为1;当通道数为16个时,分配的字节数digital_bytes为2。但是相对时间偏移量的计算依赖于digital_bytes,所以这种类似的情况下,digital_bytes的值不同会导致计算出的相对时间偏移量完全不同,最终导致计算出的时间索引会出现不可预料的结果。

修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 修正后代码

# 模拟通道*2 + 8字节时间戳
self.frame_size = self.analog_count * 2 + 8

# 数字通道字节数计算
d_temp = self.digital_count % 16
temp1 = int(self.digital_count / 16)

if d_temp:
# 有余数的情况:需要额外分配一个16位单元(2字节)
self.frame_size = self.frame_size + temp1 * 2 + 2
self.digital_bytes = temp1 * 2 + 2
else:
# 无余数的情况:刚好按16位边界对齐
self.frame_size = self.frame_size + temp1 * 2
self.digital_bytes = temp1 * 2

修改后的代码确保了:

  • 对于任何数字通道数量,计算的digital_bytes都完全相同
  • 文件长度验证逻辑能够正常工作
  • DAT文件解析时的字节偏移计算保持准确