def pack_data(data, format_pattern): fmt = get_format(format_pattern) values = (big5.encode(data[name]) if 's' in f else data[name] for name, f in format_pattern) return struct.pack(fmt, *values)
FILE_ANONYMOUS = 0x80 # anonymous file STRLEN = 80 # Length of most string data if __name__ == '__main__': assert struct.calcsize(get_format(BOARDHEADER_FMT)) == BOARDHEADER_SIZE assert struct.calcsize(get_format(FILEHEADER_FMT)) == FILEHEADER_SIZE assert struct.calcsize(get_format(USEREC_FMT)) == USEREC_SIZE with open('/home/bbs/boards/A/ALLPOST/.DIR', 'rb') as f: entry = f.read(FILEHEADER_SIZE) header = unpack_data(entry, FILEHEADER_FMT) print header xblob = pack_data(header, FILEHEADER_FMT) assert xblob == entry with open('/home/bbs/.PASSWDS', 'rb') as f: entry = f.read(USEREC_SIZE) user = unpack_data(entry, USEREC_FMT) print user with open('/home/bbs/.BRD', 'rb') as f: entry = f.read(BOARDHEADER_SIZE) board = unpack_data(entry, BOARDHEADER_FMT) print board print 'user name: ', big5.encode(user['realname']) print 'file title: ', big5.encode(header['title']) print 'board title: ', big5.encode(board['title'])