Python3.7中含0x00的集合长度计算错误问题咨询
问题排查与解决方案
你的问题根源非常明确——你错误地使用了集合(set)来存储字节数据,而集合会自动剔除重复元素,这直接导致了长度计算错误。
具体原因拆解
你定义的barray是一个集合:
barray = { 0x22, 0x00, 0x43, 0x61, 0x62, 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x78, 0x00, 0x01, 0x00, 0x41, 0x54, 0xff, 0xff, 0xff, 0xff }
集合的核心特性是元素唯一,不允许重复。你的原始数据里存在多个重复值:
0x00出现了3次 → 集合中仅保留1个0x61(对应字符'a')出现了2次 → 集合中仅保留1个0x62(对应字符'b')出现了2次 → 集合中仅保留1个0xff出现了4次 → 集合中仅保留1个
原本你预期的20个元素,经过集合去重后只剩下15个,所以len(barray)返回15,进而(15-4)/8 = 11/8 = 1.375,和你看到的结果完全吻合。
修复方案
- 将集合改为列表(list):列表允许重复元素,能完整保留你所有的原始字节值:
barray = [0x22, 0x00, 0x43, 0x61, 0x62, 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x78, 0x00, 0x01, 0x00, 0x41, 0x54, 0xff, 0xff, 0xff, 0xff] - 使用整数除法计算行数:为了得到整数结果,建议用
//替代/,避免出现浮点数:rows = (length - 4) // 8
修改后运行代码,len(barray)会返回20,rows会返回2,完全符合你的预期。
内容的提问来源于stack exchange,提问作者spl
相关产品推荐
相关产品推荐

