问题分析
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
|
self.frame_size = self.analog_count * 2 + 8
d_temp = self.digital_count % 16 temp1 = int(self.digital_count / 16)
if d_temp: self.frame_size = self.frame_size + temp1 * 2 + 2 self.digital_bytes = temp1 * 2 + 2 else: self.frame_size = self.frame_size + temp1 * 2 self.digital_bytes = temp1 * 2
|
修改后的代码确保了:
- 对于任何数字通道数量,计算的
digital_bytes都完全相同
- 文件长度验证逻辑能够正常工作
- DAT文件解析时的字节偏移计算保持准确