import struct import sys PAGE_SIZE = 16384 def read_page(filename): with open(filename, "rb") as f: return f.read(PAGE_SIZE) def parse_record(data, offset, col_types): """ 简化版:假设表结构已知,col_types 是列类型列表,例如: ["CHAR(32)", "CHAR(32)", "DATETIME", "DATETIME", "VARCHAR"] """ values = [] pos = offset for col in col_types: if col.startswith("CHAR(32)"): val = data[pos:pos+32].decode("utf-8", errors="ignore").strip("\x00") pos += 32 elif col == "DATETIME": # InnoDB DATETIME 存储为8字节整数(简化处理) raw = struct.unpack(">Q", data[pos:pos+8])[0] pos += 8 # 转换为 YYYY-MM-DD HH:MM:SS year = raw >> 46 month = (raw >> 42) & 0xF day = (raw >> 37) & 0x1F hour = (raw >> 32) & 0x1F minute = (raw >> 26) & 0x3F second = (raw >> 20) & 0x3F val = f"{year:04d}-{month:02d}-{day:02d} {hour:02d}:{minute:02d}:{second:02d}" else: # VARCHAR 或其他 length = data[pos] pos += 1 val = data[pos:pos+length].decode("utf-8", errors="ignore") pos += length values.append(val) return values def parse_page(filename, col_types): page = read_page(filename) # 页目录在页尾,简化:假设有固定数量记录 records = [] for i in range(10): # 假设最多10条 offset = 100 + i*200 # 简化:假设每条200字节 rec = parse_record(page, offset, col_types) records.append(rec) return records if __name__ == "__main__": if len(sys.argv) < 2: print("用法: python3 innodb_page_parser.py ") sys.exit(1) col_types = ["CHAR(32)", "CHAR(32)", "DATETIME", "DATETIME", "VARCHAR"] records = parse_page(sys.argv[1], col_types) for r in records: print(",".join(r))