public static LPKTable[] ReadLPKTable(ArrayByte dis, int fileTableNumber) { LPKTable[] fileTable = new LPKTable[fileTableNumber]; for (int i = 0; i < fileTableNumber; i++) { LPKTable ft = new LPKTable(); ft.SetFileName(dis.ReadByteArray(LPKHeader.LF_FILE_LENGTH)); ft.SetFileSize(dis.ReadLong()); ft.SetOffSet(dis.ReadLong()); fileTable[i] = ft; } return(fileTable); }
public static byte[] ReadFileFromPak(ArrayByte dis, int size, LPKTable fileTable) { dis.Skip(fileTable.GetOffSet() - size); int fileLength = (int)fileTable.GetFileSize(); byte[] fileBuff = new byte[fileLength]; int readLength = dis.Read(fileBuff, 0, fileLength); if (readLength < fileLength) { return(null); } else { NativeSupport.MakeBuffer(fileBuff, readLength, 0xF7); return(fileBuff); } }
/// <summary> /// 读取数据流 /// </summary> /// /// <param name="dis"></param> /// <param name="header"></param> /// <param name="fileTable"></param> /// <returns></returns> /// <exception cref="System.Exception"></exception> public static byte[] ReadFileFromPak(DataInputStream dis, LPKHeader header, LPKTable fileTable) { dis.Skip(fileTable.GetOffSet() - OutputOffset(header)); int fileLength = (int)fileTable.GetFileSize(); byte[] fileBuff = new byte[fileLength]; int readLength = dis.Read(fileBuff, 0, fileLength); if (readLength < fileLength) { return(null); } else { MakeBuffer(fileBuff, readLength); return(fileBuff); } }
public static byte[] OpenResource(string fileName, string resName) { try { PAK pak = (PAK)CollectionUtils.Get(pakRes, fileName); Stream ins = Resources.OpenStream(fileName); ArrayByte result = null; if (CACHE) { if (cacheRes == null) { cacheRes = new System.Collections.Generic.Dictionary <string, ArrayByte>( CollectionUtils.INITIAL_CAPACITY); } result = (ArrayByte)CollectionUtils.Get(cacheRes, fileName); if (result == null) { result = new ArrayByte(ins, ArrayByte.LITTLE_ENDIAN); CollectionUtils.Put(cacheRes, fileName, result); } else { result.Reset(ArrayByte.LITTLE_ENDIAN); } } else { result = new ArrayByte(ins, ArrayByte.LITTLE_ENDIAN); } if (pak == null) { pak = new PAK(); LPKHeader header = ReadHeader(result); pak.tables = ReadLPKTable(result, (int)header.GetTables()); pak.head_size = (int)(LPKHeader.Size() + header.GetTables() * LPKTable.Size()); pak.skip = result.Position(); pak.length = result.Length(); CollectionUtils.Put(pakRes, fileName, pak); } else { result.SetPosition(pak.skip); } bool find = false; int fileIndex = 0; string innerName = null; LPKTable[] tables_0 = pak.tables; int size = tables_0.Length; for (int i = 0; i < size; i++) { innerName = tables_0[i].GetFileName(); if (resName.Equals(innerName, System.StringComparison.InvariantCultureIgnoreCase)) { find = true; fileIndex = i; break; } } if (!find) { throw new Exception("File not found. ( " + fileName + " )"); } else { return(ReadFileFromPak(result, pak.head_size, tables_0[fileIndex])); } } catch (Exception) { throw new Exception("File not found. ( " + fileName + " )"); } }
public static byte[] ReadFileFromPak(ArrayByte dis, int size, LPKTable fileTable) { dis.Skip(fileTable.GetOffSet() - size); int fileLength = (int) fileTable.GetFileSize(); byte[] fileBuff = new byte[fileLength]; int readLength = dis.Read(fileBuff, 0, fileLength); if (readLength < fileLength) { return null; } else { NativeSupport.MakeBuffer(fileBuff, readLength, 0xF7); return fileBuff; } }
public static LPKTable[] ReadLPKTable(ArrayByte dis, int fileTableNumber) { LPKTable[] fileTable = new LPKTable[fileTableNumber]; for (int i = 0; i < fileTableNumber; i++) { LPKTable ft = new LPKTable(); ft.SetFileName(dis.ReadByteArray(LPKHeader.LF_FILE_LENGTH)); ft.SetFileSize(dis.ReadLong()); ft.SetOffSet(dis.ReadLong()); fileTable[i] = ft; } return fileTable; }
/// <summary> /// 获得指定头文件的偏移长度 /// </summary> /// /// <param name="header"></param> /// <returns></returns> public static long OutputOffset(LPKHeader header) { return(LPKHeader.Size() + header.GetTables() * LPKTable.Size()); }