本文整理汇总了C#中Stream.ReadValueU16方法的典型用法代码示例。如果您正苦于以下问题:C# Stream.ReadValueU16方法的具体用法?C# Stream.ReadValueU16怎么用?C# Stream.ReadValueU16使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Stream
的用法示例。
在下文中一共展示了Stream.ReadValueU16方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Deserialize
public void Deserialize(Stream input)
{
var magic = input.ReadValueU32(Endian.Little);
if (magic != 0x434F4E44 && // COND
magic.Swap() != 0x434F4E44)
{
throw new FormatException();
}
var endian = magic == 0x434F4E44 ? Endian.Little : Endian.Big;
var version = input.ReadValueU32(endian);
if (version != 1)
{
throw new FormatException();
}
this.Version = version;
var unknown08 = input.ReadValueU16(endian);
var count = input.ReadValueU16(endian);
var ids = new int[count];
var offsets = new uint[count];
for (ushort i = 0; i < count; i++)
{
ids[i] = input.ReadValueS32(endian);
offsets[i] = input.ReadValueU32(endian);
}
for (ushort i = 0; i < count; i++)
{
var id = ids[i];
var offset = offsets[i];
input.Seek(offset, SeekOrigin.Begin);
var flags = input.ReadValueU8();
var valueType = (Conditionals.ValueType)((flags & 0x0F) >> 0);
var opType = (Conditionals.OpType)((flags & 0xF0) >> 4);
if (valueType == Conditionals.ValueType.Bool)
{
switch (opType)
{
default:
{
throw new NotSupportedException();
}
}
}
}
//throw new NotImplementedException();
this.Endian = endian;
}
示例2: Deserialize
public static object Deserialize(Stream input, FieldType type, bool littleEndian)
{
switch (type)
{
case FieldType.UInt8: return input.ReadValueU8();
case FieldType.Int8: return input.ReadValueS8();
case FieldType.UInt16: return input.ReadValueU16(littleEndian);
case FieldType.Int16: return input.ReadValueS16(littleEndian);
case FieldType.UInt32: return input.ReadValueU32(littleEndian);
case FieldType.Int32: return input.ReadValueS32(littleEndian);
case FieldType.UInt64: return input.ReadValueU64(littleEndian);
case FieldType.Int64: return input.ReadValueS64(littleEndian);
case FieldType.Single: return input.ReadValueF32(littleEndian);
case FieldType.Double: return input.ReadValueF64(littleEndian);
case FieldType.Vector3:
{
var value = new Builtins.Vector3();
value.Deserialize(input, littleEndian);
return value;
}
case FieldType.Vector4:
{
var value = new Builtins.Vector4();
value.Deserialize(input, littleEndian);
return value;
}
case FieldType.Quaternion:
{
var value = new Builtins.Quaternion();
value.Deserialize(input, littleEndian);
return value;
}
case FieldType.String:
{
throw new NotSupportedException("cannot deserialize strings via Builtin");
}
case FieldType.Color:
{
var value = new Builtins.Color();
value.Deserialize(input, littleEndian);
return value;
}
case FieldType.Matrix4x4:
{
var value = new Builtins.Matrix4x4();
value.Deserialize(input, littleEndian);
return value;
}
}
throw new NotSupportedException("unsupported builtin type");
}
示例3: DecompressME1orME2
/// <summary>
/// decompress an entire ME1 or 2 pcc file.
/// </summary>
/// <param name="raw">pcc file passed in stream format</param>
/// <returns>a decompressed stream.</returns>
public static MemoryStream DecompressME1orME2(Stream raw)
{
raw.Seek(4, SeekOrigin.Begin);
ushort versionLo = raw.ReadValueU16();
ushort versionHi = raw.ReadValueU16();
raw.Seek(12, SeekOrigin.Begin);
int tempNameSize = raw.ReadValueS32();
raw.Seek(64 + tempNameSize, SeekOrigin.Begin);
int tempGenerations = raw.ReadValueS32();
raw.Seek(36 + tempGenerations * 12, SeekOrigin.Current);
//if ME1
if (versionLo == 491 && versionHi == 1008)
{
raw.Seek(4, SeekOrigin.Current);
}
int pos = 4;
int NumChunks = raw.ReadValueS32();
List<Chunk> Chunks = new List<Chunk>();
//DebugOutput.PrintLn("Reading chunk headers...");
for (int i = 0; i < NumChunks; i++)
{
Chunk c = new Chunk();
c.uncompressedOffset = raw.ReadValueS32();
c.uncompressedSize = raw.ReadValueS32();
c.compressedOffset = raw.ReadValueS32();
c.compressedSize = raw.ReadValueS32();
c.Compressed = new byte[c.compressedSize];
c.Uncompressed = new byte[c.uncompressedSize];
//DebugOutput.PrintLn("Chunk " + i + ", compressed size = " + c.compressedSize + ", uncompressed size = " + c.uncompressedSize);
//DebugOutput.PrintLn("Compressed offset = " + c.compressedOffset + ", uncompressed offset = " + c.uncompressedOffset);
Chunks.Add(c);
}
//DebugOutput.PrintLn("\tRead Chunks...");
int count = 0;
for (int i = 0; i < Chunks.Count; i++)
{
Chunk c = Chunks[i];
raw.Seek(c.compressedOffset, SeekOrigin.Begin);
c.Compressed = raw.ReadBytes(c.compressedSize);
ChunkHeader h = new ChunkHeader();
h.magic = BitConverter.ToInt32(c.Compressed, 0);
if (h.magic != -1641380927)
throw new FormatException("Chunk magic number incorrect");
h.blocksize = BitConverter.ToInt32(c.Compressed, 4);
h.compressedsize = BitConverter.ToInt32(c.Compressed, 8);
h.uncompressedsize = BitConverter.ToInt32(c.Compressed, 12);
//DebugOutput.PrintLn("Chunkheader read: Magic = " + h.magic + ", Blocksize = " + h.blocksize + ", Compressed Size = " + h.compressedsize + ", Uncompressed size = " + h.uncompressedsize);
pos = 16;
int blockCount = (h.uncompressedsize % h.blocksize == 0)
?
h.uncompressedsize / h.blocksize
:
h.uncompressedsize / h.blocksize + 1;
List<Block> BlockList = new List<Block>();
//DebugOutput.PrintLn("\t\t" + count + " Read Blockheaders...");
for (int j = 0; j < blockCount; j++)
{
Block b = new Block();
b.compressedsize = BitConverter.ToInt32(c.Compressed, pos);
b.uncompressedsize = BitConverter.ToInt32(c.Compressed, pos + 4);
//DebugOutput.PrintLn("Block " + j + ", compressed size = " + b.compressedsize + ", uncompressed size = " + b.uncompressedsize);
pos += 8;
BlockList.Add(b);
}
int outpos = 0;
//DebugOutput.PrintLn("\t\t" + count + " Read and decompress Blocks...");
foreach (Block b in BlockList)
{
byte[] datain = new byte[b.compressedsize];
byte[] dataout = new byte[b.uncompressedsize];
for (int j = 0; j < b.compressedsize; j++)
datain[j] = c.Compressed[pos + j];
pos += b.compressedsize;
try
{
LZO1X.Decompress(datain, dataout);
}
catch
{
throw new Exception("LZO decompression failed!");
}
for (int j = 0; j < b.uncompressedsize; j++)
c.Uncompressed[outpos + j] = dataout[j];
outpos += b.uncompressedsize;
}
c.header = h;
c.blocks = BlockList;
count++;
Chunks[i] = c;
//.........这里部分代码省略.........
示例4: Compress
/// <summary>
/// compress an entire ME3 pcc into a byte array.
/// </summary>
/// <param name="uncompressedPcc">uncompressed pcc stream.</param>
/// <returns>a compressed array of bytes.</returns>
public static Stream Compress(Stream uncompressedPcc)
{
uncompressedPcc.Position = 0;
var magic = uncompressedPcc.ReadValueU32(Endian.Little);
if (magic != 0x9E2A83C1 &&
magic.Swap() != 0x9E2A83C1)
{
throw new FormatException("not a pcc package");
}
var endian = magic == 0x9E2A83C1 ?
Endian.Little : Endian.Big;
var encoding = endian == Endian.Little ?
Encoding.Unicode : Encoding.BigEndianUnicode;
var versionLo = uncompressedPcc.ReadValueU16(endian);
var versionHi = uncompressedPcc.ReadValueU16(endian);
if (versionLo != 684 &&
versionHi != 194)
{
throw new FormatException("unsupported version");
}
uncompressedPcc.Seek(4, SeekOrigin.Current);
var folderNameLength = uncompressedPcc.ReadValueS32(endian);
var folderNameByteLength =
folderNameLength >= 0 ? folderNameLength : (-folderNameLength * 2);
uncompressedPcc.Seek(folderNameByteLength, SeekOrigin.Current);
var packageFlagsOffset = uncompressedPcc.Position;
var packageFlags = uncompressedPcc.ReadValueU32(endian);
if ((packageFlags & 8) != 0)
{
uncompressedPcc.Seek(4, SeekOrigin.Current);
}
var nameCount = uncompressedPcc.ReadValueU32(endian);
var namesOffset = uncompressedPcc.ReadValueU32(endian);
var exportCount = uncompressedPcc.ReadValueU32(endian);
var exportInfosOffset = uncompressedPcc.ReadValueU32(endian);
SortedDictionary<uint, uint> exportDataOffsets = new SortedDictionary<uint, uint>();
Stream data;
if ((packageFlags & 0x02000000) == 0)
{
data = uncompressedPcc;
}
else
{
throw new FormatException("pcc data is compressed");
}
// get info about export data, sizes and offsets
data.Seek(exportInfosOffset, SeekOrigin.Begin);
for (uint i = 0; i < exportCount; i++)
{
var classIndex = data.ReadValueS32(endian);
data.Seek(4, SeekOrigin.Current);
var outerIndex = data.ReadValueS32(endian);
var objectNameIndex = data.ReadValueS32(endian);
data.Seek(16, SeekOrigin.Current);
uint exportDataSize = data.ReadValueU32(endian);
uint exportDataOffset = data.ReadValueU32(endian);
exportDataOffsets.Add(exportDataOffset, exportDataSize);
data.Seek(4, SeekOrigin.Current);
var count = data.ReadValueU32(endian);
data.Seek(count * 4, SeekOrigin.Current);
data.Seek(20, SeekOrigin.Current);
}
const uint maxBlockSize = 0x100000;
Stream outputStream = new MemoryStream();
// copying pcc header
byte[] buffer = new byte[130];
uncompressedPcc.Seek(0, SeekOrigin.Begin);
uncompressedPcc.Read(buffer, 0, 130);
outputStream.Write(buffer, 0, buffer.Length);
//add compressed pcc flag
uncompressedPcc.Seek(12, SeekOrigin.Begin);
folderNameLength = uncompressedPcc.ReadValueS32();
folderNameByteLength =
folderNameLength >= 0 ? folderNameLength : (-folderNameLength * 2);
uncompressedPcc.Seek(folderNameByteLength, SeekOrigin.Current);
outputStream.Seek(uncompressedPcc.Position, SeekOrigin.Begin);
packageFlags = uncompressedPcc.ReadValueU32();
packageFlags |= 0x02000000; // add compression flag
outputStream.WriteValueU32(packageFlags);
//.........这里部分代码省略.........
示例5: DecompressME3
/// <summary>
/// decompress an entire ME3 pcc file into a new stream
/// </summary>
/// <param name="input">pcc file passed in stream format</param>
/// <returns>a decompressed array of bytes</returns>
public static MemoryStream DecompressME3(Stream input)
{
input.Seek(0, SeekOrigin.Begin);
var magic = input.ReadValueU32(Endian.Little);
if (magic != 0x9E2A83C1 &&
magic.Swap() != 0x9E2A83C1)
{
throw new FormatException("not a pcc file");
}
var endian = magic == 0x9E2A83C1 ? Endian.Little : Endian.Big;
var versionLo = input.ReadValueU16(endian);
var versionHi = input.ReadValueU16(endian);
if (versionLo != 684 &&
versionHi != 194)
{
throw new FormatException("unsupported pcc version");
}
long headerSize = 8;
input.Seek(4, SeekOrigin.Current);
headerSize += 4;
var folderNameLength = input.ReadValueS32(endian);
headerSize += 4;
var folderNameByteLength =
folderNameLength >= 0 ? folderNameLength : (-folderNameLength * 2);
input.Seek(folderNameByteLength, SeekOrigin.Current);
headerSize += folderNameByteLength;
var packageFlagsOffset = input.Position;
var packageFlags = input.ReadValueU32(endian);
headerSize += 4;
if ((packageFlags & 0x02000000u) == 0)
{
throw new FormatException("pcc file is already decompressed");
}
if ((packageFlags & 8) != 0)
{
input.Seek(4, SeekOrigin.Current);
headerSize += 4;
}
uint nameCount = input.ReadValueU32(endian);
uint nameOffset = input.ReadValueU32(endian);
input.Seek(52, SeekOrigin.Current);
headerSize += 60;
var generationsCount = input.ReadValueU32(endian);
input.Seek(generationsCount * 12, SeekOrigin.Current);
headerSize += generationsCount * 12;
input.Seek(20, SeekOrigin.Current);
headerSize += 24;
var blockCount = input.ReadValueU32(endian);
int headBlockOff = (int)input.Position;
var afterBlockTableOffset = headBlockOff + (blockCount * 16);
var indataOffset = afterBlockTableOffset + 8;
byte[] buff;
input.Seek(0, SeekOrigin.Begin);
MemoryStream output = new MemoryStream();
output.Seek(0, SeekOrigin.Begin);
output.WriteFromStream(input, headerSize);
output.WriteValueU32(0, endian); // block count
input.Seek(afterBlockTableOffset, SeekOrigin.Begin);
output.WriteFromStream(input, 8);
//check if has extra name list (don't know it's usage...)
if ((packageFlags & 0x10000000) != 0)
{
long curPos = output.Position;
output.WriteFromStream(input, nameOffset - curPos);
}
//decompress blocks in parallel
Task<byte[]>[] tasks = new Task<byte[]>[blockCount];
uint[] uncompressedOffsets = new uint[blockCount];
for (int i = 0; i < blockCount; i++)
{
input.Seek(headBlockOff, SeekOrigin.Begin);
uncompressedOffsets[i] = input.ReadValueU32(endian);
var uncompressedSize = input.ReadValueU32(endian);
var compressedOffset = input.ReadValueU32(endian);
var compressedSize = input.ReadValueU32(endian);
headBlockOff = (int)input.Position;
//.........这里部分代码省略.........
示例6: Deserialize
public void Deserialize(Stream input, Endian endianness)
{
this.DataSize = input.ReadValueU32(endianness);
var type = input.ReadValueU8();
if (ValidSectionTypes.ContainsKey(type) == false)
{
throw new FormatException("unknown section type");
}
this.Type = (SectionType)type;
this.Unknown05 = input.ReadValueU8();
this.Unknown06 = input.ReadValueU16(endianness);
this.Flags = input.ReadValueU32(endianness);
this.Id = input.ReadValueU32(endianness);
this.Unknown10 = input.ReadValueU32(endianness);
}
示例7: Deserialize
public void Deserialize(Stream input)
{
var magic = input.ReadValueU32(Endian.Little);
if (magic != 0x53464152 && // SFAR
magic.Swap() != 0x53464152)
{
throw new FormatException();
}
var endian = magic == 0x53464152 ? Endian.Little : Endian.Big;
var version = input.ReadValueU32(endian);
if (version != 0x00010000)
{
throw new FormatException();
}
var dataOffset = input.ReadValueU32(endian);
var fileTableOffset = input.ReadValueU32(endian);
var fileTableCount = input.ReadValueU32(endian);
var blockSizeTableOffset = input.ReadValueU32(endian);
this.MaximumBlockSize = input.ReadValueU32(endian);
this.CompressionScheme = input
.ReadValueEnum<SFXArchive.CompressionScheme>(endian);
if (fileTableOffset != 0x20)
{
throw new FormatException();
}
if (this.MaximumBlockSize != 0x010000)
{
throw new FormatException();
}
/*
if (this.CompressionScheme != SFXArchive.CompressionScheme.None &&
this.CompressionScheme != SFXArchive.CompressionScheme.LZMA &&
this.CompressionScheme != SFXArchive.CompressionScheme.LZX)
{
throw new FormatException();
}
*/
input.Seek(blockSizeTableOffset, SeekOrigin.Begin);
var blockSizeTableSize = dataOffset - fileTableOffset;
var blockSizeTableCount = blockSizeTableSize / 2;
this.BlockSizes.Clear();
for (uint i = 0; i < blockSizeTableCount; i++)
{
this.BlockSizes.Add(input.ReadValueU16(endian));
}
input.Seek(fileTableOffset, SeekOrigin.Begin);
for (uint i = 0; i < fileTableCount; i++)
{
// ReSharper disable UseObjectOrCollectionInitializer
var entry = new SFXArchive.Entry();
// ReSharper restore UseObjectOrCollectionInitializer
entry.NameHash = input.ReadFileNameHash();
entry.BlockSizeIndex = input.ReadValueS32(endian);
entry.UncompressedSize = input.ReadValueU32(endian);
entry.UncompressedSize |= ((long)input.ReadValueU8()) << 32;
entry.Offset = input.ReadValueU32(endian);
entry.Offset |= ((long)input.ReadValueU8()) << 32;
this.Entries.Add(entry);
}
}
示例8: Deserialize
public void Deserialize(Stream input)
{
var magic = input.ReadValueU32(Endian.Little);
if (magic != 0x53464152 && // SFAR
magic.Swap() != 0x53464152)
{
throw new FormatException();
}
var endian = magic == 0x53464152 ? Endian.Little : Endian.Big;
var version = input.ReadValueU32(endian);
if (version != 0x00010000)
{
throw new FormatException();
}
var dataOffset = input.ReadValueU32(endian);
bool firstDataOffset = true;
uint minDataOffset = dataOffset;
//Console.WriteLine("Data Offset: {0:X8}",dataOffset);
var fileTableOffset = input.ReadValueU32(endian);
//Console.WriteLine("File Table Offset: {0:X8}",fileTableOffset);
var fileTableCount = input.ReadValueU32(endian);
//Console.WriteLine("File Table Count: {0:X8}",fileTableCount);
var blockSizeTableOffset = input.ReadValueU32(endian);
//Console.WriteLine("Block Size Table Offset: {0:X8}",blockSizeTableOffset);
this.MaximumBlockSize = input.ReadValueU32(endian);
this.CompressionScheme = input
.ReadValueEnum<SFXArchive.CompressionScheme>(endian);
if (fileTableOffset != 0x20)
{
throw new FormatException();
}
if (this.MaximumBlockSize != 0x010000)
{
throw new FormatException();
}
/*
if (this.CompressionScheme != SFXArchive.CompressionScheme.None &&
this.CompressionScheme != SFXArchive.CompressionScheme.LZMA &&
this.CompressionScheme != SFXArchive.CompressionScheme.LZX)
{
throw new FormatException();
}
*/
input.Seek(fileTableOffset, SeekOrigin.Begin);
for (uint i = 0; i < fileTableCount; i++)
{
// ReSharper disable UseObjectOrCollectionInitializer
var entry = new SFXArchive.Entry();
entry.entryOffset = input.Position;
// ReSharper restore UseObjectOrCollectionInitializer
entry.nameHash = input.ReadFileNameHash();
//Console.WriteLine("FileNameHash: {0}",entry.NameHash.ToString());
entry.blockSizeIndex = input.ReadValueS32(endian);
//Console.WriteLine("Begin position: {0:X8}",input.Position);
entry.uncompressedSize = input.ReadValueU32(endian);
entry.uncompressedSize |= ((long)input.ReadValueU8()) << 32;
//Console.WriteLine(" End position: {0:X8}",input.Position);
entry.dataOffset = input.ReadValueU32(endian);
entry.dataOffset |= ((long)input.ReadValueU8()) << 32;
if(firstDataOffset)
{
minDataOffset = (uint)entry.dataOffset;
firstDataOffset = false;
}
else
{
if(minDataOffset > entry.dataOffset)
minDataOffset = (uint)entry.dataOffset;
}
//if(entry.NameHash.Equals (fileNameListNameHash))Console.WriteLine("Offset: {0:X10}, UncSize {1:X10}",entry.Offset,entry.UncompressedSize);
this.Entries.Add(entry);
}
if(minDataOffset > dataOffset)
dataOffset = minDataOffset;
input.Seek(blockSizeTableOffset, SeekOrigin.Begin);
var blockSizeTableSize = dataOffset - blockSizeTableOffset;
var blockSizeTableCount = blockSizeTableSize / 2;
//ushort aux;
//Console.WriteLine("dataOffset: {0:X8}\nfileTableOffset: {1:X8}\nBlockSizeTableSize: {2:X8}\nblockSizeTableOffset: {3:X8}", dataOffset,fileTableOffset,blockSizeTableSize,blockSizeTableOffset);
this.BlockSizes.Clear();
//Console.WriteLine("initial position: {0:X8}",input.Position);
//Console.WriteLine("blockSizeTableCount: {0}",blockSizeTableCount);
for (uint i = 0; i < blockSizeTableCount; i++)
{
this.BlockSizes.Add(input.ReadValueU16(endian));
}
//Console.WriteLine("final position: {0:X8}",input.Position);
//Console.WriteLine("number of repetitions: {0}",blockSizeTableCount);
//var fileNameListNameHash = new FileNameHash(
// new byte[] { 0xB5, 0x50, 0x19, 0xCB, 0xF9, 0xD3, 0xDA, 0x65, 0xD5, 0x5B, 0x32, 0x1C, 0x00, 0x19, 0x69, 0x7C, });
}
示例9: Deserialize
public void Deserialize(Stream input)
{
if (input.ReadValueU32() != 0x55AA1234)
{
input.Seek(-4, SeekOrigin.Current);
}
else
{
uint version = input.ReadValueU32();
uint indexSize = input.ReadValueU32();
if (version != 1)
{
throw new FormatException("unexpected version " + version.ToString());
}
}
List<PackageEntry> entries = new List<PackageEntry>();
// Types
while (true)
{
string typeName = input.ReadStringASCIIZ();
if (typeName == "")
{
break;
}
// Directories
while (true)
{
string directoryName = input.ReadStringASCIIZ();
if (directoryName == "")
{
break;
}
// Files
while (true)
{
string fileName = input.ReadStringASCIIZ();
if (fileName == "")
{
break;
}
PackageEntry entry = new PackageEntry();
entry.FileName = fileName;
entry.DirectoryName = directoryName.Replace("/", "\\");
entry.TypeName = typeName;
entry.CRC32 = input.ReadValueU32();
entry.SmallData = new byte[input.ReadValueU16()];
entry.ArchiveIndex = input.ReadValueU16();
entry.Offset = input.ReadValueU32();
entry.Size = input.ReadValueU32();
UInt16 terminator = input.ReadValueU16();
if (terminator != 0xFFFF)
{
throw new FormatException("invalid terminator");
}
if (entry.SmallData.Length > 0)
{
input.Read(entry.SmallData, 0, entry.SmallData.Length);
}
entries.Add(entry);
}
}
}
this.Entries = entries;
}
示例10: Deserialize
public void Deserialize(Stream input)
{
if (input.ReadValueU32() != 0x57325243) // 'W2RC' -> Witcher 2 Resource?
{
throw new FormatException();
}
this.Version = input.ReadValueU32();
if (this.Version < 83 || this.Version > 115)
{
throw new FormatException();
}
var flags = input.ReadValueU32();
var nameDataOffset = input.ReadValueU32();
var nameCount = input.ReadValueU32();
var objectDataOffset = input.ReadValueU32();
var objectCount = input.ReadValueU32();
var linkDataOffset = input.ReadValueU32();
var linkCount = input.ReadValueU32();
uint dependencyDataOffset = 0;
uint dependencyCount = 0;
if (this.Version >= 46)
{
dependencyDataOffset = input.ReadValueU32();
dependencyCount = input.ReadValueU32();
}
var info = new Resource.Info();
info.Names = new string[nameCount];
if (nameCount > 0)
{
input.Seek(nameDataOffset, SeekOrigin.Begin);
for (uint i = 0; i < nameCount; i++)
{
info.Names[i] = input.ReadEncodedString();
}
}
info.Links = new Resource.LinkInfo[linkCount];
if (linkCount > 0)
{
input.Seek(linkDataOffset, SeekOrigin.Begin);
for (uint i = 0; i < linkCount; i++)
{
var link = new Resource.LinkInfo();
link.FileName = input.ReadEncodedStringW();
link.Unknown1 = input.ReadValueU16();
link.Unknown2 = input.ReadValueU16();
info.Links[i] = link;
}
}
this.Dependencies.Clear();
if (dependencyCount > 1)
{
input.Seek(dependencyDataOffset, SeekOrigin.Begin);
info.Dependencies = new string[dependencyCount];
for (uint i = 1; i < dependencyCount; i++)
{
var path = input.ReadEncodedString();
info.Dependencies[i] = path;
this.Dependencies.Add(path);
}
}
this.Objects = new List<Resource.ObjectInfo>();
info.Objects = new Resource.ObjectInfo[objectCount];
if (objectCount > 0)
{
input.Seek(objectDataOffset, SeekOrigin.Begin);
var offsets = new Dictionary<Resource.ObjectInfo, ObjectLocation>();
for (uint i = 0; i < objectCount; i++)
{
var typeNameIndex = input.ReadValueS16();
if (typeNameIndex < 1 ||
typeNameIndex > info.Names.Length)
{
throw new FormatException();
}
var obj = new Resource.ObjectInfo();
obj.TypeName = info.Names[typeNameIndex - 1];
var parentIndex = input.ReadValueS32();
var location = new ObjectLocation();
location.Size = input.ReadValueU32();
location.Offset = input.ReadValueU32();
obj.Flags = input.ReadValueU32();
obj.Unknown5 = input.ReadValueU32();
obj.Link = this.Version < 102 ? null : input.ReadEncodedString();
//.........这里部分代码省略.........
示例11: ReadPackage
private static Stream ReadPackage(Stream input)
{
var magic = input.ReadValueU32(Endian.Little);
if (magic != 0x9E2A83C1 &&
magic.Swap() != 0x9E2A83C1)
{
throw new FormatException("not a package");
}
var endian = magic == 0x9E2A83C1
? Endian.Little
: Endian.Big;
var versionLo = input.ReadValueU16(endian);
var versionHi = input.ReadValueU16(endian);
if (versionLo != 684 &&
versionHi != 194)
{
throw new FormatException("unsupported version");
}
input.Seek(4, SeekOrigin.Current);
var folderNameLength = input.ReadValueS32(endian);
var folderNameByteLength =
folderNameLength >= 0 ? folderNameLength : (-folderNameLength * 2);
input.Seek(folderNameByteLength, SeekOrigin.Current);
/*var packageFlagsOffset = input.Position;*/
var packageFlags = input.ReadValueU32(endian);
if ((packageFlags & 8) != 0)
{
input.Seek(4, SeekOrigin.Current);
}
input.Seek(24, SeekOrigin.Current);
if ((packageFlags & 0x02000000) == 0)
{
return input;
}
input.Seek(36, SeekOrigin.Current);
var generationsCount = input.ReadValueU32(endian);
input.Seek(generationsCount * 12, SeekOrigin.Current);
input.Seek(20, SeekOrigin.Current);
var blockCount = input.ReadValueU32(endian);
var blockStream = new BlockStream(input);
for (int i = 0; i < blockCount; i++)
{
var uncompressedOffset = input.ReadValueU32(endian);
var uncompressedSize = input.ReadValueU32(endian);
var compressedOffset = input.ReadValueU32(endian);
var compressedSize = input.ReadValueU32(endian);
blockStream.AddBlock(
uncompressedOffset,
uncompressedSize,
compressedOffset,
compressedSize);
}
return blockStream;
}
示例12: Deserialize
public void Deserialize(Stream input)
{
if (input.ReadValueU32() != 0x39444350)
{
throw new FormatException();
}
this.Format = input.ReadValueEnum<PCD9.Format>();
var dataSize = input.ReadValueU32();
this.Unknown0C = input.ReadValueU32();
this.Width = input.ReadValueU16();
this.Height = input.ReadValueU16();
this.BPP = input.ReadValueU8();
var mipMapCount = 1 + input.ReadValueU8();
this.Unknown16 = input.ReadValueU16();
if ((this.Unknown16 & 0x8000) != 0)
{
throw new NotSupportedException();
this.unknownFlag = true;
}
this.Mipmaps.Clear();
using (var data = input.ReadToMemoryStream(dataSize))
{
var mipWidth = this.Width;
var mipHeight = this.Height;
for (int i = 0; i < mipMapCount; i++)
{
if (mipWidth == 0)
{
mipWidth = 1;
}
if (mipHeight == 0)
{
mipHeight = 1;
}
int size;
switch (this.Format)
{
case PCD9.Format.A8R8G8B8:
{
size = mipWidth * mipHeight * 4;
break;
}
case PCD9.Format.DXT1:
case PCD9.Format.DXT3:
case PCD9.Format.DXT5:
{
int blockCount = ((mipWidth + 3) / 4) * ((mipHeight + 3) / 4);
int blockSize = this.Format == PCD9.Format.DXT1 ? 8 : 16;
size = blockCount * blockSize;
break;
}
default:
{
throw new NotSupportedException();
}
}
var buffer = new byte[size];
if (data.Read(buffer, 0, buffer.Length) != buffer.Length)
{
throw new EndOfStreamException();
}
this.Mipmaps.Add(new PCD9.Mipmap()
{
Width = mipWidth,
Height = mipHeight,
Data = buffer,
});
mipWidth >>= 1;
mipHeight >>= 1;
}
if (data.Position != data.Length)
{
throw new InvalidOperationException();
}
}
}
示例13: Deserialize
public void Deserialize(Stream input)
{
this.DosHeader = input.ReadStructure<Image.DosHeader>();
if (this.DosHeader.Magic != 0x5A4D) // MZ
{
throw new FormatException("dos header has bad magic");
}
input.Seek(this.DosHeader.NewExeOffset, SeekOrigin.Begin);
this.NTHeaders32 = input.ReadStructure<Image.NTHeaders32>();
if (this.NTHeaders32.Signature != 0x4550 || this.NTHeaders32.FileHeader.SizeOfOptionalHeader != 0xE0) // PE
{
throw new FormatException("nt header has bad signature");
}
else if (this.NTHeaders32.OptionalHeader.Magic != 0x10B) // IMAGE_NT_OPTIONAL_HDR32_MAGIC
{
throw new FormatException("optional header has bad magic");
}
this.Directories = new List<Image.DataDirectory>();
for (int i = 0; i < this.NTHeaders32.OptionalHeader.NumberOfRvaAndSizes; i++)
{
this.Directories.Add(input.ReadStructure<Image.DataDirectory>());
}
this.Sections = new List<Image.SectionHeader>();
for (int i = 0; i < this.NTHeaders32.FileHeader.NumberOfSections; i++)
{
this.Sections.Add(input.ReadStructure<Image.SectionHeader>());
}
this.Exports = new Dictionary<UInt32, UInt32>();
this.ExportNames = new Dictionary<string, UInt32>();
if (
this.Directories.Count >= 1 &&
this.Directories[0].VirtualAddress != 0 &&
this.Directories[0].Size != 0)
{
var fileOffset = this.GetFileOffset(this.Directories[0].VirtualAddress, true);
input.Seek(fileOffset, SeekOrigin.Begin);
Image.ExportDirectory exportDirectory = input.ReadStructure<Image.ExportDirectory>();
if (exportDirectory.NumberOfNames > 0)
{
var nameOffsets = new UInt32[exportDirectory.NumberOfNames];
var names = new string[exportDirectory.NumberOfNames];
var ordinals = new UInt16[exportDirectory.NumberOfNames];
input.Seek(this.GetFileOffset(exportDirectory.AddressOfNames, true), SeekOrigin.Begin);
for (uint i = 0; i < exportDirectory.NumberOfNames; i++)
{
nameOffsets[i] = input.ReadValueU32();
}
input.Seek(this.GetFileOffset(exportDirectory.AddressOfNameOrdinals, true), SeekOrigin.Begin);
for (uint i = 0; i < exportDirectory.NumberOfNames; i++)
{
ordinals[i] = input.ReadValueU16();
}
for (uint i = 0; i < exportDirectory.NumberOfNames; i++)
{
input.Seek(this.GetFileOffset(nameOffsets[i], true), SeekOrigin.Begin);
var name = input.ReadStringZ(Encoding.ASCII);
this.ExportNames.Add(name, exportDirectory.Base + ordinals[i]);
}
}
if (exportDirectory.NumberOfFunctions > 0)
{
input.Seek(this.GetFileOffset(exportDirectory.AddressOfFunctions, true), SeekOrigin.Begin);
for (uint i = 0; i < exportDirectory.NumberOfFunctions; i++)
{
var address = input.ReadValueU32();
if (address == 0)
{
continue;
}
this.Exports.Add(exportDirectory.Base + i, address);
}
}
}
}
示例14: Deserialize
public void Deserialize(Stream input)
{
var magic = input.ReadValueU32(Endian.Little);
if (magic != 0x434F4E44 && // COND
magic.Swap() != 0x434F4E44)
{
throw new FormatException();
}
var endian = magic == 0x434F4E44 ? Endian.Little : Endian.Big;
var version = input.ReadValueU32(endian);
if (version != 1)
{
throw new FormatException();
}
this.Version = version;
var unknown08 = input.ReadValueU16(endian);
var count = input.ReadValueU16(endian);
var ids = new int[count];
var offsets = new uint[count];
for (ushort i = 0; i < count; i++)
{
ids[i] = input.ReadValueS32(endian);
offsets[i] = input.ReadValueU32(endian);
}
var sortedOffsets = offsets
.OrderBy(o => o)
.Distinct()
.ToArray();
this._Buffers.Clear();
for (int i = 0; i < sortedOffsets.Length; i++)
{
var offset = sortedOffsets[i];
if (offset == 0)
{
continue;
}
var nextOffset = i + 1 < sortedOffsets.Length
? sortedOffsets[i + 1]
: input.Length;
input.Seek(offset, SeekOrigin.Begin);
var length = (int)(nextOffset - offset);
var bytes = input.ReadBytes(length);
this._Buffers.Add(offset, bytes);
}
this._Conditionals.Clear();
for (int i = 0; i < count; i++)
{
this._Conditionals.Add(ids[i], offsets[i]);
}
this.Endian = endian;
}
示例15: Deserialize
public void Deserialize(Stream input)
{
var version = input.ReadValueU16();
if (version < 2 || version > 5)
{
throw new FormatException("unsupported cfs version");
}
var header = new Sprite.Header();
if (version >= 5)
{
header = input.ReadStructure<Sprite.Header>();
}
else if (version >= 4)
{
var oldHeader = input.ReadStructure<Sprite.OldHeader4>();
header.FrameCount = oldHeader.FrameCount;
header.AnimationTime = oldHeader.AnimationTime;
header.Width = oldHeader.Width;
header.Height = oldHeader.Height;
header.RowCount = oldHeader.RowCount;
header.ColumnCount = oldHeader.ColumnCount;
header.ShadowCount = oldHeader.ShadowCount;
header.LightCount = oldHeader.LightCount;
header.UserDataSize = oldHeader.UserDataSize;
header.CompressionFlags = (Sprite.CompressionFlags)oldHeader.CompressionFlags;
header.MaxSolidIndex = oldHeader.MaxSolidIndex;
header.DataSize = oldHeader.DataSize;
header.Category = oldHeader.Category;
header.BlitMode = oldHeader.BlitMode;
header.RowMeaning = oldHeader.RowMeaning;
header.YSortAdjust = oldHeader.YSortAdjust;
header.SortTransform = oldHeader.SortTransform;
header.UserPaletteStart = oldHeader.UserPaletteStart;
header.UserPalette = oldHeader.UserPalette;
header.Description = oldHeader.Description;
}
else if (version >= 3)
{
var oldHeader = input.ReadStructure<Sprite.OldHeader3>();
header.FrameCount = oldHeader.FrameCount;
header.AnimationTime = oldHeader.AnimationTime;
header.Width = oldHeader.Width;
header.Height = oldHeader.Height;
header.RowCount = oldHeader.RowCount;
header.ColumnCount = oldHeader.ColumnCount;
header.ShadowCount = oldHeader.ShadowCount;
header.LightCount = oldHeader.LightCount;
header.UserDataSize = oldHeader.UserDataSize;
header.CompressionFlags = (Sprite.CompressionFlags)oldHeader.CompressionFlags;
header.MaxSolidIndex = oldHeader.MaxSolidIndex;
header.DataSize = oldHeader.DataSize;
header.Category = oldHeader.Category;
header.BlitMode = oldHeader.BlitMode;
header.RowMeaning = oldHeader.RowMeaning;
header.YSortAdjust = oldHeader.YSortAdjust;
header.SortTransform = oldHeader.SortTransform;
header.UserPaletteStart = oldHeader.UserPaletteStart;
header.UserPalette = oldHeader.UserPalette;
}
else if (version >= 1)
{
var oldHeader = input.ReadStructure<Sprite.OldHeader2>();
header.FrameCount = oldHeader.FrameCount;
header.AnimationTime = oldHeader.AnimationTime;
header.Width = oldHeader.Width;
header.Height = oldHeader.Height;
header.RowCount = oldHeader.RowCount;
header.ColumnCount = oldHeader.ColumnCount;
header.ShadowCount = oldHeader.ShadowCount;
header.LightCount = oldHeader.LightCount;
header.UserDataSize = oldHeader.UserDataSize;
header.CompressionFlags = (Sprite.CompressionFlags)oldHeader.CompressionFlags;
header.MaxSolidIndex = oldHeader.MaxSolidIndex;
header.DataSize = oldHeader.DataSize;
}
if (header.LightCount != 0 &&
header.LightCount != 32)
{
throw new FormatException();
}
if (header.ShadowCount != 0 &&
header.ShadowCount != 8)
{
throw new FormatException();
}
this.AnimationTime = header.AnimationTime;
this.Width = header.Width;
this.Height = header.Height;
this.RowCount = header.RowCount;
this.ColumnCount = header.ColumnCount;
this.ShadowCount = header.ShadowCount;
this.LightCount = header.LightCount;
this.MaxSolidIndex = header.MaxSolidIndex;
this.CompressionFlags = header.CompressionFlags;
//.........这里部分代码省略.........