protocol_parser.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. def parse_protocol(hex_data):
  2. """
  3. 解析2字节数据协议
  4. :param hex_data: 16进制数据,可以是字符串(如"0x1A3F"或"1A3F")或整数
  5. :return: 解析结果字典
  6. """
  7. if isinstance(hex_data, str):
  8. hex_str = hex_data.strip().upper()
  9. if hex_str.startswith('0X'):
  10. hex_str = hex_str[2:]
  11. value = int(hex_str, 16)
  12. elif isinstance(hex_data, int):
  13. value = hex_data
  14. else:
  15. raise ValueError("输入必须是16进制字符串或整数")
  16. if value < 0 or value > 0xFFFF:
  17. raise ValueError("输入必须是2字节数据(0x0000-0xFFFF)")
  18. result = {}
  19. result['D0_时间有效标志'] = '时间有效' if (value & 0x0001) else '时间无效'
  20. result['D1_定向数据有效标志'] = '定向数据有效' if (value & 0x0002) else '定向数据无效'
  21. result['D2_守时能力标志'] = '可守时' if (value & 0x0004) else '不可守时'
  22. loc_type = (value >> 3) & 0x03
  23. loc_types = {
  24. 0: '记忆定位数据',
  25. 1: '卫星定位数据',
  26. 2: '惯性定位数据',
  27. 3: '组合定位数据'
  28. }
  29. result['D3-D4_定位数据类型'] = loc_types.get(loc_type, f'未知({loc_type})')
  30. time_code_type = (value >> 5) & 0x03
  31. time_code_types = {
  32. 0: '保留',
  33. 1: '卫星时间数据',
  34. 2: '导航设备本机数据',
  35. 3: '原子钟时间'
  36. }
  37. result['D5-D6_时码数据类型'] = time_code_types.get(time_code_type, f'未知({time_code_type})')
  38. result['D7_J码有效标志'] = 'J码有效期以内' if (value & 0x0080) else 'J码有效期以外'
  39. satellite_type = (value >> 8) & 0x03
  40. satellite_types = {
  41. 0: '保留',
  42. 1: '当前为北斗数据',
  43. 2: '保留',
  44. 3: '当前为混合数据'
  45. }
  46. result['D8-D9_卫星数据类型'] = satellite_types.get(satellite_type, f'未知({satellite_type})')
  47. result['D10_原子钟与卫星时间同步标志'] = '原子钟与卫星时间不同步' if (value & 0x0400) else '原子钟与卫星时间同步'
  48. result['D11_原子钟与卫星秒脉冲同步标志'] = '原子钟与卫星秒脉冲不同步' if (value & 0x0800) else '原子钟与卫星秒脉冲同步'
  49. result['D12_码型标志'] = 'J码' if (value & 0x1000) else '民码'
  50. result['D13_遥毙状态标志'] = '遥毙成功' if (value & 0x2000) else '遥毙无效'
  51. result['D14_J码星历准备状态1'] = 'J码星历准备好' if (value & 0x4000) else 'J码星历未准备好'
  52. result['D15_J码星历准备状态2'] = 'J码星历准备好' if (value & 0x8000) else 'J码星历未准备好'
  53. return result
  54. def main():
  55. import sys
  56. if len(sys.argv) != 2:
  57. print("用法: python protocol_parser.py <16进制数据>")
  58. print("示例: python protocol_parser.py 0x1A3F")
  59. print("示例: python protocol_parser.py 1A3F")
  60. return
  61. hex_input = sys.argv[1]
  62. try:
  63. parsed = parse_protocol(hex_input)
  64. print("解析结果:")
  65. print("-" * 40)
  66. for key, value in parsed.items():
  67. print(f"{key}: {value}")
  68. except ValueError as e:
  69. print(f"错误: {e}")
  70. if __name__ == "__main__":
  71. main()