1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
import sys
HID_KEYBOARD = { 0x04: 'a', 0x05: 'b', 0x06: 'c', 0x07: 'd', 0x08: 'e', 0x09: 'f', 0x0A: 'g', 0x0B: 'h', 0x0C: 'i', 0x0D: 'j', 0x0E: 'k', 0x0F: 'l', 0x10: 'm', 0x11: 'n', 0x12: 'o', 0x13: 'p', 0x14: 'q', 0x15: 'r', 0x16: 's', 0x17: 't', 0x18: 'u', 0x19: 'v', 0x1A: 'w', 0x1B: 'x', 0x1C: 'y', 0x1D: 'z', 0x1E: '1', 0x1F: '2', 0x20: '3', 0x21: '4', 0x22: '5', 0x23: '6', 0x24: '7', 0x25: '8', 0x26: '9', 0x27: '0', 0x28: '\n', 0x2C: ' ', 0x2D: '-', 0x2E: '=', 0x2F: '[', 0x30: ']', 0x31: '\\', 0x33: ';', 0x34: "'", 0x36: ',', 0x37: '.', 0x38: '/', }
SHIFTED_KEYS = { 0x04: 'A', 0x05: 'B', 0x06: 'C', 0x07: 'D', 0x08: 'E', 0x09: 'F', 0x0A: 'G', 0x0B: 'H', 0x0C: 'I', 0x0D: 'J', 0x0E: 'K', 0x0F: 'L', 0x10: 'M', 0x11: 'N', 0x12: 'O', 0x13: 'P', 0x14: 'Q', 0x15: 'R', 0x16: 'S', 0x17: 'T', 0x18: 'U', 0x19: 'V', 0x1A: 'W', 0x1B: 'X', 0x1C: 'Y', 0x1D: 'Z', 0x1E: '!', 0x1F: '@', 0x20: '#', 0x21: '$', 0x22: '%', 0x23: '^', 0x24: '&', 0x25: '*', 0x26: '(', 0x27: ')', 0x2D: '_', 0x2E: '+', 0x2F: '{', 0x30: '}', 0x31: '|', 0x33: ':', 0x34: '"', 0x36: '<', 0x37: '>', 0x38: '?', }
def parse_hid_line(line): """解析一行 HID 报告""" line = line.strip().replace(' ', '') if len(line) < 2: return None
data = [int(line[i:i+2], 16) for i in range(0, len(line), 2)] if len(data) < 3: return None
modifier = data[0] keycode = data[2]
if keycode == 0: return None
shift = modifier & 0x22 if shift: return SHIFTED_KEYS.get(keycode, '') else: return HID_KEYBOARD.get(keycode, '')
def parse_usbdata_file(filename): with open(filename, 'r') as f: result = '' for line in f: char = parse_hid_line(line) if char: result += char return result
if __name__ == "__main__": if len(sys.argv) < 2: print("Usage: python usb_hid_parser.py usbdata.txt") sys.exit(1)
output = parse_usbdata_file(sys.argv[1]) print("解析结果:") print(output)
|