import sys
def calculate_can_filter(ids, frame_type='standard'):
""" 计算CAN过滤器的ID和掩码(逻辑不变) """
bit_length = 11 if frame_type == 'standard' else 29
bin_ids = []
for id_str in ids:
id_int = int(id_str, 16)
bin_str = bin(id_int)[2:].zfill(bit_length)
bin_ids.append(bin_str)
mask_bits = []
id_bits = []
for i in range(bit_length):
bits_at_position = [bin_str[i] for bin_str in bin_ids]
if all(b == bits_at_position[0] for b in bits_at_position):
mask_bits.append('1')
id_bits.append(bits_at_position[0])
else:
mask_bits.append('0')
id_bits.append('0')
mask_int = int(''.join(mask_bits), 2)
id_int = int(''.join(id_bits), 2)
return (
f"0x{id_int:03X}" if frame_type == 'standard' else f"0x{id_int:08X}",
f"0x{mask_int:03X}" if frame_type == 'standard' else f"0x{mask_int:08X}"
)
if __name__ == "__main__":
try:
input_lines = [line.strip() for line in sys.stdin if line.strip()]
if not input_lines:
print("错误: 未检测到输入内容")
sys.exit(1)
max_id = max(int(id_str, 16) for id_str in input_lines)
frame_type = 'extended' if max_id > 0x7FF else 'standard'
id_result, mask_result = calculate_can_filter(input_lines, frame_type)
print(f"ID: {id_result}\nMask: {mask_result}")
except ValueError as e:
print(f"输入格式错误: {str(e)}")
sys.exit(1)
except Exception as e:
print(f"运行时错误: {str(e)}")
sys.exit(1)