本文整理汇总了C#中System.IO.MemoryStream.WriteValueS32方法的典型用法代码示例。如果您正苦于以下问题:C# MemoryStream.WriteValueS32方法的具体用法?C# MemoryStream.WriteValueS32怎么用?C# MemoryStream.WriteValueS32使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类System.IO.MemoryStream
的用法示例。
在下文中一共展示了MemoryStream.WriteValueS32方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: CompressChunk
public byte[] CompressChunk(Chunk chunk)
{
int numBlocks = (chunk.Uncompressed.Length + maxBlockSize - 1) / maxBlockSize;
if (numBlocks > 8)
throw new FormatException("Maximum block number exceeded");
ChunkHeader head = new ChunkHeader();
head.magic = -1641380927;
head.blocksize = maxBlockSize;
head.uncompressedsize = chunk.Uncompressed.Length;
int pos = 0;
MemoryStream mem = new MemoryStream();
List<Block> blockList = new List<Block>();
int startData = 16 + 8 * numBlocks;
mem.Seek(startData, SeekOrigin.Begin);
for (int i = 0; i < numBlocks; i++)
{
Block block = new Block();
byte[] result, temp;
if (i != numBlocks - 1)
{
block.uncompressedsize = maxBlockSize;
temp = new byte[maxBlockSize];
}
else
{
block.uncompressedsize = head.uncompressedsize - pos;
temp = new byte[block.uncompressedsize];
}
Buffer.BlockCopy(chunk.Uncompressed, pos, temp, 0, temp.Length);
result = LZO1X.Compress(temp);
if (result.Length == 0)
throw new Exception("LZO compression error!");
block.compressedsize = result.Length;
mem.WriteBytes(result);
blockList.Add(block);
pos += maxBlockSize;
}
head.compressedsize = (int)mem.Length;
mem.Seek(0, SeekOrigin.Begin);
mem.WriteValueS32(head.magic);
mem.WriteValueS32(head.blocksize);
mem.WriteValueS32(head.compressedsize);
mem.WriteValueS32(head.uncompressedsize);
foreach (Block block in blockList)
{
mem.WriteValueS32(block.compressedsize);
mem.WriteValueS32(block.uncompressedsize);
}
return mem.ToArray();
}
示例2: ToArray
public byte[] ToArray()
{
MemoryStream buffer = new MemoryStream();
buffer.WriteValueU32(firstVal);
buffer.WriteValueS32(pccRef.Names.FindIndex(name => name == "None"));
buffer.Seek(16, SeekOrigin.Begin);
buffer.WriteValueU32(otherVal);
buffer.WriteValueS32(enumTextureGroups.Count);
foreach (ByteProp byteProp in enumTextureGroups)
{
buffer.WriteValueS32(pccRef.Names.FindIndex(name => name == byteProp.name));
buffer.WriteValueS32(byteProp.value);
}
return buffer.ToArray();
}
示例3: Compress
/*
* Name function: Compress
* Purpose: compress a part of the byte array into a Zlib Block
* Input: - buffer: byte array
* - offset: starting offset inside the array
* - count: num of bytes to compress starting from the offset
* Output: compressed byte array block, the structure is:
* - magic word
* - max segment size
* - total compressed size
* - total uncompressed size
* - segment list
* - compressed data list
*/
public static byte[] Compress(byte[] buffer, int offset, int count)
{
if(buffer == null)
throw new ArgumentNullException();
if (count < 0)
throw new FormatException();
if (offset + count > buffer.Length)
throw new IndexOutOfRangeException();
MemoryStream headBlock = new MemoryStream();
MemoryStream dataBlock = new MemoryStream();
DeflaterOutputStream zipStream;
int numSeg = (int)Math.Ceiling((double)count / (double)maxSegmentSize);
headBlock.WriteValueU32(magic);
headBlock.WriteValueU32(maxSegmentSize);
headBlock.WriteValueU32(0x0); //total compressed size, still to calculate
headBlock.WriteValueS32(count); //total uncompressed size
for (int i = count; i > 0; i -= (int)maxSegmentSize)
{
int copyBytes = Math.Min(i, (int)maxSegmentSize);
uint precCompSize = (uint)dataBlock.Length;
zipStream = new DeflaterOutputStream(dataBlock);
zipStream.Write(buffer, offset + (count - i), copyBytes);
zipStream.Flush();
zipStream.Finish();
headBlock.WriteValueU32((uint)dataBlock.Length - precCompSize); //compressed segment size
headBlock.WriteValueS32(copyBytes); //uncompressed segment size
//Console.WriteLine(" Segment size: {0}, total read: {1}, compr size: {2}", maxSegmentSize, copyBytes, (uint)dataBlock.Length - precCompSize);
}
headBlock.Seek(8, SeekOrigin.Begin);
headBlock.WriteValueS32((int)dataBlock.Length); // total compressed size
byte[] finalBlock = new byte[headBlock.Length + dataBlock.Length];
Buffer.BlockCopy(headBlock.ToArray(), 0, finalBlock, 0, (int)headBlock.Length);
Buffer.BlockCopy(dataBlock.ToArray(), 0, finalBlock, (int)headBlock.Length, (int)dataBlock.Length);
headBlock.Close();
dataBlock.Close();
return finalBlock;
}
示例4: addBiggerImage
public void addBiggerImage(string imagePathToAdd, string archiveDir)
{
ImageSize biggerImageSizeOnList = imgList.Max(image => image.imgSize);
// check if replacing image is supported
ImageFile imgFile;
string fileFormat = Path.GetExtension(imagePathToAdd);
switch (fileFormat)
{
case ".dds": imgFile = new DDS(imagePathToAdd, null); break;
case ".tga": imgFile = new TGA(imagePathToAdd, null); break;
default: throw new FileFormatException(fileFormat + " image extension not supported");
}
// check if image to add is valid
if(biggerImageSizeOnList.width * 2 != imgFile.imgSize.width || biggerImageSizeOnList.height * 2 != imgFile.imgSize.height)
throw new FormatException("image size " + imgFile.imgSize + " isn't valid, must be " + new ImageSize(biggerImageSizeOnList.width * 2,biggerImageSizeOnList.height * 2));
// this check avoids insertion inside textures that have only 1 image stored inside pcc
if(!imgList.Exists(img => img.storageType != storage.empty && img.storageType != storage.pccSto))
throw new Exception("Unable to add image, texture must have a reference to an external archive");
// !!! warning, this method breaks consistency between imgList and imageData[] !!!
ImageInfo newImgInfo = new ImageInfo();
newImgInfo.storageType = imgList.Find(img => img.storageType != storage.empty && img.storageType != storage.pccSto).storageType;
newImgInfo.imgSize = imgFile.imgSize;
newImgInfo.uncSize = imgFile.resize().Length;
newImgInfo.cprSize = 0x00; // not yet filled
newImgInfo.offset = 0x00; // not yet filled
imgList.Insert(0, newImgInfo); // insert new image on top of the list
//now I let believe the program that I'm doing an image replace, saving lot of code ;)
replaceImage(newImgInfo.imgSize.ToString(), imagePathToAdd, archiveDir);
//updating num of images
numMipMaps++;
// update MipTailBaseIdx
//PropertyReader.Property MipTail = properties["MipTailBaseIdx"];
int propVal = properties["MipTailBaseIdx"].Value.IntValue;
propVal++;
properties["MipTailBaseIdx"].Value.IntValue = propVal;
//MessageBox.Show("raw size: " + properties["MipTailBaseIdx"].raw.Length + "\nproperty offset: " + properties["MipTailBaseIdx"].offsetval);
using (MemoryStream rawStream = new MemoryStream(properties["MipTailBaseIdx"].raw))
{
rawStream.Seek(rawStream.Length - 4, SeekOrigin.Begin);
rawStream.WriteValueS32(propVal);
properties["MipTailBaseIdx"].raw = rawStream.ToArray();
}
//properties["MipTailBaseIdx"] = MipTail;
// update Sizes
//PropertyReader.Property Size = properties["SizeX"];
propVal = (int)newImgInfo.imgSize.width;
properties["SizeX"].Value.IntValue = propVal;
using (MemoryStream rawStream = new MemoryStream(properties["SizeX"].raw))
{
rawStream.Seek(rawStream.Length - 4, SeekOrigin.Begin);
rawStream.WriteValueS32(propVal);
properties["SizeX"].raw = rawStream.ToArray();
}
//properties["SizeX"] = Size;
//Size = properties["SizeY"];
properties["SizeY"].Value.IntValue = (int)newImgInfo.imgSize.height;
using (MemoryStream rawStream = new MemoryStream(properties["SizeY"].raw))
{
rawStream.Seek(rawStream.Length - 4, SeekOrigin.Begin);
rawStream.WriteValueS32(propVal);
properties["SizeY"].raw = rawStream.ToArray();
}
//properties["SizeY"] = Size;
properties["OriginalSizeX"].Value.IntValue = propVal;
using (MemoryStream rawStream = new MemoryStream(properties["OriginalSizeX"].raw))
{
rawStream.Seek(rawStream.Length - 4, SeekOrigin.Begin);
rawStream.WriteValueS32(propVal);
properties["OriginalSizeX"].raw = rawStream.ToArray();
}
properties["OriginalSizeY"].Value.IntValue = propVal;
using (MemoryStream rawStream = new MemoryStream(properties["OriginalSizeY"].raw))
{
rawStream.Seek(rawStream.Length - 4, SeekOrigin.Begin);
rawStream.WriteValueS32(propVal);
properties["OriginalSizeY"].raw = rawStream.ToArray();
}
}
示例5: OneImageToRuleThemAll
public void OneImageToRuleThemAll(string archiveDir, ImageFile im, out string newTextureGroup, byte[] imgData)
{
newTextureGroup = null;
ImageMipMapHandler imgMipMap = new ImageMipMapHandler("", imgData);
// starts from the smaller image
for (int i = imgMipMap.imageList.Count - 1; i >= 0; i--)
{
ImageFile newImageFile = imgMipMap.imageList[i];
// insert images only with size > 64
if (newImageFile.imgSize.width < 64 && newImageFile.imgSize.height < 64)
continue;
// if the image size exists inside the texture2d image list then we have to replace it
if (imgList.Exists(img => img.imgSize == newImageFile.imgSize))
{
// ...but at least for now I can reuse my replaceImage function... ;)
replaceImage(newImageFile.imgSize.ToString(), newImageFile, archiveDir);
}
else // if the image doesn't exists then we have to add it
{
// ...and use my addBiggerImage function! :P
addBiggerImage(newImageFile, archiveDir);
}
File.Delete(newImageFile.fileName);
}
// add texturegroup_world inside GamerSettings.ini in order to overwrite values
ImageSize maxSize = imgList.Max(image => image.imgSize);
uint maxValue = Math.Max(maxSize.width, maxSize.height);
string section = "SystemSettings";
string key = "texturegroup_shadowmap";
string newValue = "(MinLODSize=128,MaxLODSize=" + maxValue + ",LODBias=0)";
IniFile iniFile = new IniFile(ME3Directory.GamerSettingsIniFile);
string oldValue = iniFile.IniReadValue(section, key);
if (oldValue == "")
{
iniFile.IniWriteValue(section, key, newValue);
}
else
{
char[] delimiters = new char[] { '=', ',' };
uint maxLODSize = Convert.ToUInt32(oldValue.Split(delimiters)[3]);
if (maxValue > maxLODSize)
iniFile.IniWriteValue(section, key, newValue);
}
// check that Texture2D has a TextureGroup
if (!properties.ContainsKey("LODGroup"))
return;
// extracting values from LODGroup Property
PropertyReader.Property LODGroup = properties["LODGroup"];
string textureGroupName = pccRef.Names[LODGroup.Value.IntValue];
string newTextureGroupName = "TEXTUREGROUP_Shadowmap";
textureGroupName = newTextureGroupName;
if (!pccRef.Names.Exists(name => name == newTextureGroupName))
pccRef.Names.Add(newTextureGroupName);
using (MemoryStream rawStream = new MemoryStream(LODGroup.raw))
{
rawStream.Seek(32, SeekOrigin.Begin);
rawStream.WriteValueS32(pccRef.Names.FindIndex(name => name == newTextureGroupName));
//rawStream.Seek(32, SeekOrigin.Begin);
rawStream.WriteValueS32(0);
properties["LODGroup"].raw = rawStream.ToArray();
}
}
示例6: singleImageUpscale
public void singleImageUpscale(ImageFile im, string archiveDir)
{
ImageSize biggerImageSizeOnList = privateimgList.Max(image => image.imgSize);
// check if replacing image is supported
ImageFile imgFile = im;
ImageEngineFormat imageFileFormat = Textures.Methods.ParseFormat(imgFile.format);
//NEW Check for correct image format
if (texFormat != imageFileFormat)
throw new FormatException("Different image format, original is " + texFormat + ", new is " + imgFile.subtype());
// !!! warning, this method breaks consistency between imgList and imageData[] !!!
ImageInfo newImgInfo = new ImageInfo();
newImgInfo.storageType = privateimgList.Find(img => img.storageType != storage.empty && img.storageType != storage.pccSto).storageType;
newImgInfo.imgSize = imgFile.imgSize;
newImgInfo.uncSize = imgFile.resize().Length;
newImgInfo.cprSize = 0x00; // not yet filled
newImgInfo.offset = 0x00; // not yet filled
//imgList.Insert(0, newImgInfo); // insert new image on top of the list
privateimgList.RemoveAt(0); // Remove old single image and add new one
privateimgList.Add(newImgInfo);
//now I let believe the program that I'm doing an image replace, saving lot of code ;)
replaceImage2(newImgInfo.imgSize.ToString(), im, archiveDir);
// update Sizes
//PropertyReader.Property Size = properties["SizeX"];
int propVal = (int)newImgInfo.imgSize.width;
properties["SizeX"].Value.IntValue = propVal;
using (MemoryStream rawStream = new MemoryStream(properties["SizeX"].raw))
{
rawStream.Seek(rawStream.Length - 4, SeekOrigin.Begin);
rawStream.WriteValueS32(propVal);
properties["SizeX"].raw = rawStream.ToArray();
}
//properties["SizeX"] = Size;
//Size = properties["SizeY"];
properties["SizeY"].Value.IntValue = (int)newImgInfo.imgSize.height;
using (MemoryStream rawStream = new MemoryStream(properties["SizeY"].raw))
{
rawStream.Seek(rawStream.Length - 4, SeekOrigin.Begin);
rawStream.WriteValueS32(propVal);
properties["SizeY"].raw = rawStream.ToArray();
}
//properties["SizeY"] = Size;
properties["OriginalSizeX"].Value.IntValue = propVal;
using (MemoryStream rawStream = new MemoryStream(properties["OriginalSizeX"].raw))
{
rawStream.Seek(rawStream.Length - 4, SeekOrigin.Begin);
rawStream.WriteValueS32(propVal);
properties["OriginalSizeX"].raw = rawStream.ToArray();
}
properties["OriginalSizeY"].Value.IntValue = propVal;
using (MemoryStream rawStream = new MemoryStream(properties["OriginalSizeY"].raw))
{
rawStream.Seek(rawStream.Length - 4, SeekOrigin.Begin);
rawStream.WriteValueS32(propVal);
properties["OriginalSizeY"].raw = rawStream.ToArray();
}
//this.hasChanged = true;
}
示例7: removeImage
public void removeImage()
{
privateimgList.RemoveAt(0);
numMipMaps--;
int propVal = properties["MipTailBaseIdx"].Value.IntValue;
propVal--;
properties["MipTailBaseIdx"].Value.IntValue = propVal;
using (MemoryStream rawStream = new MemoryStream(properties["MipTailBaseIdx"].raw))
{
rawStream.Seek(rawStream.Length - 4, SeekOrigin.Begin);
rawStream.WriteValueS32(propVal);
properties["MipTailBaseIdx"].raw = rawStream.ToArray();
}
propVal = (int)privateimgList[0].imgSize.width;
properties["SizeX"].Value.IntValue = propVal;
using (MemoryStream rawStream = new MemoryStream(properties["SizeX"].raw))
{
rawStream.Seek(rawStream.Length - 4, SeekOrigin.Begin);
rawStream.WriteValueS32(propVal);
properties["SizeX"].raw = rawStream.ToArray();
}
properties["SizeY"].Value.IntValue = (int)privateimgList[0].imgSize.height;
using (MemoryStream rawStream = new MemoryStream(properties["SizeY"].raw))
{
rawStream.Seek(rawStream.Length - 4, SeekOrigin.Begin);
rawStream.WriteValueS32(propVal);
properties["SizeY"].raw = rawStream.ToArray();
}
properties["OriginalSizeX"].Value.IntValue = propVal;
using (MemoryStream rawStream = new MemoryStream(properties["OriginalSizeX"].raw))
{
rawStream.Seek(rawStream.Length - 4, SeekOrigin.Begin);
rawStream.WriteValueS32(propVal);
properties["OriginalSizeX"].raw = rawStream.ToArray();
}
properties["OriginalSizeY"].Value.IntValue = propVal;
using (MemoryStream rawStream = new MemoryStream(properties["OriginalSizeY"].raw))
{
rawStream.Seek(rawStream.Length - 4, SeekOrigin.Begin);
rawStream.WriteValueS32(propVal);
properties["OriginalSizeY"].raw = rawStream.ToArray();
}
}
示例8: CopyImgList
public void CopyImgList(ME3SaltTexture2D inTex, ME3PCCObject pcc)
{
imageData = inTex.imageData;
privateimgList = inTex.privateimgList;
numMipMaps = inTex.numMipMaps;
//Copy Properties
byte[] buff;
using (MemoryStream tempMem = new MemoryStream())
{
tempMem.WriteBytes(headerData);
for (int i = 0; i < inTex.properties.Count; i++)
{
SaltPropertyReader.Property prop = inTex.properties.ElementAt(i).Value;
if (prop.Name == "UnpackMin")
{
for (int j = 0; j < inTex.UnpackNum; j++)
{
tempMem.WriteValueS64(pcc.addName2(prop.Name));
tempMem.WriteValueS64(pcc.addName2(prop.TypeVal.ToString()));
tempMem.WriteValueS32(prop.Size);
tempMem.WriteValueS32(j);
tempMem.WriteValueF32(prop.Value.FloatValue);
}
continue;
}
tempMem.WriteValueS64(pcc.addName2(prop.Name));
if (prop.Name == "None")
continue;
tempMem.WriteValueS64(pcc.addName2(prop.TypeVal.ToString()));
tempMem.WriteValueS64(prop.Size);
switch (prop.TypeVal)
{
case SaltPropertyReader.Type.FloatProperty:
tempMem.WriteValueF32(prop.Value.FloatValue);
break;
case SaltPropertyReader.Type.IntProperty:
tempMem.WriteValueS32(prop.Value.IntValue);
break;
case SaltPropertyReader.Type.NameProperty:
tempMem.WriteValueS64(pcc.addName2(prop.Value.StringValue));
// Heff: Modified to handle name references.
//var index = pcc.addName2(prop.Value.StringValue);
//tempMem.WriteValueS32(index);
//tempMem.WriteValueS32(prop.Value.NameValue.count);
break;
case SaltPropertyReader.Type.ByteProperty:
tempMem.WriteValueS64(pcc.addName2(prop.Value.StringValue));
tempMem.WriteValueS32(pcc.addName2(prop.Value.String2));
byte[] footer = new byte[4];
Buffer.BlockCopy(prop.raw, prop.raw.Length - 4, footer, 0, 4);
tempMem.WriteBytes(footer);
break;
case SaltPropertyReader.Type.BoolProperty:
tempMem.WriteValueBoolean(prop.Value.Boolereno);
break;
case SaltPropertyReader.Type.StructProperty:
tempMem.WriteValueS64(pcc.addName2(prop.Value.StringValue));
for (int k = 0; k < prop.Size; k++)
tempMem.WriteByte((byte)prop.Value.Array[k].IntValue);
break;
default:
throw new NotImplementedException("Property type: " + prop.TypeVal + ", not yet implemented. TELL ME ABOUT THIS!");
}
}
buff = tempMem.ToArray();
}
properties = new Dictionary<string, SaltPropertyReader.Property>();
List<SaltPropertyReader.Property> tempProperties = SaltPropertyReader.ReadProp(pcc, buff, headerData.Length);
for (int i = 0; i < tempProperties.Count; i++)
{
SaltPropertyReader.Property property = tempProperties[i];
if (property.Name == "UnpackMin")
UnpackNum++;
if (!properties.ContainsKey(property.Name))
properties.Add(property.Name, property);
switch (property.Name)
{
case "Format":
texFormat = Textures.Methods.ParseFormat(pcc.Names[property.Value.IntValue].Substring(3));
break;
case "TextureFileCacheName": arcName = property.Value.NameValue.Name; break;
case "LODGroup": LODGroup = property.Value.NameValue.Name; break;
case "None": dataOffset = (uint)(property.offsetval + property.Size); break;
}
}
// if "None" property isn't found throws an exception
if (dataOffset == 0)
throw new Exception("\"None\" property not found");
//.........这里部分代码省略.........
示例9: Save
public void Save()
{
MemoryStream m = new MemoryStream();
SerializingContainer Container = new SerializingContainer(m);
Container.isLoading = false;
Serialize(Container);
m = Container.Memory;
MemoryStream res = new MemoryStream();
List<PropertyReader.Property> props = PropertyReader.getPropList(export);
int start = props[props.Count - 1].offend;
res.Write(export.Data, 0, start);
res.WriteValueS32((int)m.Length);
res.WriteStream(m);
export.Data = res.ToArray();
}
示例10: saveToFile
public string saveToFile(bool fileOverwrite = true)
{
bChanged = false;
string finalTocFile = fileOverwrite ? tocFilePath : tocFilePath + ".tmp";
using (FileStream newFileStream = File.Create(finalTocFile))
{
newFileStream.WriteValueU32(0x3AB70C13);
newFileStream.WriteValueS32(0x0);
newFileStream.WriteValueS32(chunkList.Count);
int chunkOffset = 12;
int fileOffset = 12 + (chunkList.Count * 8);
string lastFile = chunkList.Last(x => (x.fileList != null) && x.fileList.Count(/*y => y.exist*/) != 0).fileList.Last(/*z => z.exist*/).filePath;
//foreach (chunk element in chunkList)
for(int i = 0; i < chunkList.Count; i++)
{
chunk element = chunkList[i];
newFileStream.Seek(chunkOffset, SeekOrigin.Begin);
if (element.countNextFiles == 0)// || element.fileList.Count(x => x.exist) == 0)
{
newFileStream.WriteValueS64(0x0);
chunkOffset = (int)newFileStream.Position;
}
else
{
newFileStream.WriteValueS32(fileOffset - chunkOffset);
newFileStream.WriteValueS32(element.fileList.Count/*(x => x.exist)*/);
chunkOffset = (int)newFileStream.Position;
newFileStream.Seek(fileOffset, SeekOrigin.Begin);
//foreach (fileStruct fileElement in element.fileList.Where(x => x.exist))
for(int j = 0; j < element.fileList.Count; j++)
{
fileStruct fileElement = element.fileList[j];
//if (!fileElement.exist)
// continue;
MemoryStream buffer = new MemoryStream(fileElement.blockSize);
{
if (fileElement.filePath == lastFile)
buffer.WriteValueS16(0x0);
else
buffer.WriteValueS16(fileElement.blockSize);
buffer.WriteValueS16(fileElement.flag);
buffer.WriteValueS32(fileElement.fileSize);
buffer.WriteBytes(fileElement.sha1);
buffer.WriteStringZ(fileElement.filePath);
byte[] byteBuff = new byte[fileElement.blockSize];
buffer.ToArray().CopyTo(byteBuff, 0);
newFileStream.WriteBytes(byteBuff);
}
//newFileStream.Seek(fileOffset, SeekOrigin.Begin);
}
fileOffset = (int)newFileStream.Position;
}
}
}
return finalTocFile;
}
示例11: PCCObject
public PCCObject(String path, Boolean littleEndian=true)
{
lzo = new SaltLZOHelper();
fullname = path;
BitConverter.IsLittleEndian = littleEndian;
StreamHelpers.setIsLittleEndian(littleEndian);
DebugOutput.PrintLn("Load file : " + path);
pccFileName = Path.GetFullPath(path);
MemoryStream tempStream = new MemoryStream();
if (!File.Exists(pccFileName))
throw new FileNotFoundException("PCC file not found");
using (FileStream fs = new FileStream(pccFileName, FileMode.Open, FileAccess.Read))
{
FileInfo tempInfo = new FileInfo(pccFileName);
tempStream.WriteFromStream(fs, tempInfo.Length);
if (tempStream.Length != tempInfo.Length)
{
throw new FileLoadException("File not fully read in. Try again later");
}
}
tempStream.Seek(12, SeekOrigin.Begin);
int tempNameSize = tempStream.ReadValueS32();
tempStream.Seek(64 + tempNameSize, SeekOrigin.Begin);
int tempGenerator = tempStream.ReadValueS32();
tempStream.Seek(36 + tempGenerator * 12, SeekOrigin.Current);
int tempPos = (int)tempStream.Position;
NumChunks = tempStream.ReadValueS32();
tempStream.Seek(0, SeekOrigin.Begin);
header = tempStream.ReadBytes(tempPos);
tempStream.Seek(0, SeekOrigin.Begin);
if (magic != ZBlock.magic && magic.Swap() != ZBlock.magic)
{
DebugOutput.PrintLn("Magic number incorrect: " + magic);
throw new FormatException("This is not a pcc file. The magic number is incorrect.");
}
if (bCompressed)
{
DebugOutput.PrintLn("File is compressed");
{
listsStream = lzo.DecompressPCC(tempStream, this);
//Correct the header
bCompressed = false;
listsStream.Seek(0, SeekOrigin.Begin);
listsStream.WriteBytes(header);
//Set numblocks to zero
listsStream.WriteValueS32(0);
//Write the magic number
listsStream.WriteValueS32(1026281201);
//Write 8 bytes of 0
listsStream.WriteValueS32(0);
listsStream.WriteValueS32(0);
}
}
else
{
DebugOutput.PrintLn("File already decompressed. Reading decompressed data.");
listsStream = tempStream;
}
ReadNames(listsStream);
ReadImports(listsStream);
ReadExports(listsStream);
LoadExports();
}
示例12: Serialize
public void Serialize(Stream output)
{
var saveGame = this.SaveGame;
byte[] innerUncompressedBytes;
using (var innerUncompressedData = new MemoryStream())
{
saveGame.Compose();
try
{
ProtoBuf.Serializer.Serialize(innerUncompressedData, saveGame);
}
finally
{
saveGame.Decompose();
}
innerUncompressedData.Position = 0;
innerUncompressedBytes = innerUncompressedData.ReadBytes((uint)innerUncompressedData.Length);
}
byte[] innerCompressedBytes;
using (var innerCompressedData = new MemoryStream())
{
var endian = this.Endian;
innerCompressedData.WriteValueS32(0, Endian.Big);
innerCompressedData.WriteString("WSG");
innerCompressedData.WriteValueU32(2, endian);
innerCompressedData.WriteValueU32(CRC32.Hash(innerUncompressedBytes, 0, innerUncompressedBytes.Length),
endian); // crc32
innerCompressedData.WriteValueS32(innerUncompressedBytes.Length, endian);
var encoder = new Huffman.Encoder();
encoder.Build(innerUncompressedBytes);
innerCompressedData.WriteBytes(encoder.Encode(innerUncompressedBytes));
innerCompressedData.Position = 0;
innerCompressedData.WriteValueU32((uint)(innerCompressedData.Length - 4), Endian.Big);
innerCompressedData.Position = 0;
innerCompressedBytes = innerCompressedData.ReadBytes((uint)innerCompressedData.Length);
}
byte[] compressedBytes;
if (innerCompressedBytes.Length <= BlockSize)
{
compressedBytes = new byte[innerCompressedBytes.Length +
(innerCompressedBytes.Length / 16) + 64 + 3];
var actualCompressedSize = compressedBytes.Length;
var result = LZO.Compress(innerCompressedBytes,
0,
innerCompressedBytes.Length,
compressedBytes,
0,
ref actualCompressedSize);
if (result != LZO.ErrorCode.Success)
{
throw new SaveCorruptionException(string.Format("LZO compression failure ({0})", result));
}
Array.Resize(ref compressedBytes, actualCompressedSize);
}
else
{
int innerCompressedOffset = 0;
int innerCompressedSizeLeft = innerCompressedBytes.Length;
using (var blockData = new MemoryStream())
{
var blockCount = (innerCompressedSizeLeft + BlockSize) / BlockSize;
blockData.WriteValueS32(blockCount, Endian.Big);
blockData.Position = 4 + (blockCount * 8);
var blockInfos = new List<Tuple<uint, uint>>();
while (innerCompressedSizeLeft > 0)
{
var blockUncompressedSize = Math.Min(BlockSize, innerCompressedSizeLeft);
compressedBytes = new byte[blockUncompressedSize +
(blockUncompressedSize / 16) + 64 + 3];
var actualCompressedSize = compressedBytes.Length;
var result = LZO.Compress(innerCompressedBytes,
innerCompressedOffset,
blockUncompressedSize,
compressedBytes,
0,
ref actualCompressedSize);
if (result != LZO.ErrorCode.Success)
{
throw new SaveCorruptionException(string.Format("LZO compression failure ({0})", result));
}
blockData.Write(compressedBytes, 0, actualCompressedSize);
blockInfos.Add(new Tuple<uint, uint>((uint)actualCompressedSize, BlockSize));
innerCompressedOffset += blockUncompressedSize;
//.........这里部分代码省略.........
示例13: saveToCprFile
/// <summary>
/// save PCCObject to file.
/// </summary>
/// <param name="newFileName">set full path + file name.</param>
/// <param name="saveCompress">set true if you want a zlib compressed pcc file.</param>
public void saveToCprFile(string newFileName = null, bool saveCompress = false)
{
bool bOverwriteFile = false;
if (string.IsNullOrWhiteSpace(newFileName) || newFileName == pccFileName)
{
bOverwriteFile = true;
newFileName = Path.GetFullPath(pccFileName) + ".tmp";
}
if (bDLCStored)
saveCompress = false;
using (MemoryStream newPccStream = new MemoryStream())
{
//ME3Explorer.DebugOutput.Clear();
DebugOutput.PrintLn("Saving file...");
DebugOutput.PrintLn("writing names list...");
// this condition needs a deeper check. todo...
if (bExtraNamesList)
{
//MessageBox.Show("sono dentro, dimensione extranamelist: " + extraNamesList.Length + " bytes");
newPccStream.Seek(headerSize, SeekOrigin.Begin);
newPccStream.Write(extraNamesList, 0, extraNamesList.Length);
}
//writing names list
newPccStream.Seek(NameOffset, SeekOrigin.Begin);
NameCount = Names.Count;
foreach (string name in Names)
{
newPccStream.WriteValueS32(-(name.Length + 1));
newPccStream.WriteString(name + "\0", (uint)(name.Length + 1) * 2, Encoding.Unicode);
}
DebugOutput.PrintLn("writing imports list...");
//writing import infos
ImportOffset = (int)newPccStream.Position;
ImportCount = Imports.Count;
foreach (ME3ImportEntry import in Imports)
newPccStream.Write(import.data, 0, import.data.Length);
//updating general export infos
ExportOffset = (int)newPccStream.Position;
ExportCount = Exports.Count;
expInfoEndOffset = ExportOffset + Exports.Sum(export => export.info.Length);
expDataBegOffset = expInfoEndOffset;
// WV code stuff...
DebugOutput.PrintLn("writing export data...");
int counter = 0;
int breaker = Exports.Count / 100;
if (breaker == 0)
breaker = 1;
//updating general export infos
ExportOffset = (int)newPccStream.Position;
ExportCount = Exports.Count;
expInfoEndOffset = ExportOffset + Exports.Sum(export => export.info.Length);
if (expDataBegOffset < expInfoEndOffset)
expDataBegOffset = expInfoEndOffset;
//writing export data
/*newPccStream.Seek(expDataBegOffset, SeekOrigin.Begin);
foreach (ExportEntry export in Exports)
{
//updating info values
export.DataSize = export.Data.Length;
export.DataOffset = (int)newPccStream.Position;
//writing data
newPccStream.Write(export.Data, 0, export.Data.Length);
}*/
//writing export data
List<ME3ExportEntry> unchangedExports = Exports.Where(export => !export.hasChanged || (export.hasChanged && export.Data.Length <= export.DataSize)).ToList();
List<ME3ExportEntry> changedExports = Exports.Where(export => export.hasChanged && export.Data.Length > export.DataSize).ToList();
foreach (ME3ExportEntry export in unchangedExports)
{
newPccStream.Seek(export.DataOffset, SeekOrigin.Begin);
//updating info values
export.DataSize = export.Data.Length;
//export.DataOffset = (int)newPccStream.Position;
export.DataOffset = (uint)newPccStream.Position;
//writing data
newPccStream.Write(export.Data, 0, export.Data.Length);
}
ME3ExportEntry lastExport = unchangedExports.Find(export => export.DataOffset == unchangedExports.Max(maxExport => maxExport.DataOffset));
int lastDataOffset = (int)(lastExport.DataOffset + lastExport.DataSize);
//.........这里部分代码省略.........
示例14: CopyImgList
//.........这里部分代码省略.........
}
break;
default:
throw new NotImplementedException();
}
for (int i = 0; i < tempList.Count; i++)
{
ImageInfo tempinfo = tempList[i];
if (inTex.imgList[i].storageType == storage.empty)
tempinfo.storageType = storage.empty;
tempList[i] = tempinfo;
}
imgList = tempList;
imageData = tempData.ToArray();
tempData.Close();
byte[] buff;
//Copy properties
using (MemoryStream tempMem = new MemoryStream())
{
tempMem.WriteBytes(headerData);
for (int i = 0; i < inTex.properties.Count; i++)
{
SaltPropertyReader.Property prop = inTex.properties.ElementAt(i).Value;
if (prop.Name == "UnpackMin")
{
for (int j = 0; j < inTex.UnpackNum; j++)
{
tempMem.WriteValueS64(pcc.AddName(prop.Name));
tempMem.WriteValueS64(pcc.AddName(prop.TypeVal.ToString()));
tempMem.WriteValueS32(prop.Size);
tempMem.WriteValueS32(j);
tempMem.WriteValueF32(prop.Value.FloatValue, Endian.Little);
}
continue;
}
tempMem.WriteValueS64(pcc.AddName(prop.Name));
if (prop.Name == "None")
{
for (int j = 0; j < 12; j++)
tempMem.WriteByte(0);
}
else
{
tempMem.WriteValueS64(pcc.AddName(prop.TypeVal.ToString()));
tempMem.WriteValueS64(prop.Size);
switch (prop.TypeVal)
{
case SaltPropertyReader.Type.IntProperty:
tempMem.WriteValueS32(prop.Value.IntValue);
break;
case SaltPropertyReader.Type.BoolProperty:
tempMem.Seek(-4, SeekOrigin.Current);
tempMem.WriteValueS32(prop.Value.IntValue);
tempMem.Seek(4, SeekOrigin.Current);
break;
case SaltPropertyReader.Type.NameProperty:
tempMem.WriteValueS64(pcc.AddName(prop.Value.StringValue));
break;
case SaltPropertyReader.Type.StrProperty:
tempMem.WriteValueS32(prop.Value.StringValue.Length + 1);
示例15: ToArray
public byte[] ToArray(int pccExportDataOffset, PCCObject pcc)
{
MemoryStream buffer = new MemoryStream();
buffer.Write(headerData, 0, headerData.Length);
if (properties.ContainsKey("LODGroup"))
{
properties["LODGroup"].Value.StringValue = "TEXTUREGROUP_LightAndShadowMap";
//properties["LODGroup"].Value.IntValue = 1025;
}
else
{
buffer.WriteValueS64(pcc.AddName("LODGroup"));
buffer.WriteValueS64(pcc.AddName("ByteProperty"));
buffer.WriteValueS64(8);
buffer.WriteValueS32(pcc.AddName("TEXTUREGROUP_LightAndShadowMap"));
buffer.WriteValueS32(1025);
}
foreach (KeyValuePair<string, SaltPropertyReader.Property> kvp in properties)
{
SaltPropertyReader.Property prop = kvp.Value;
if (prop.Name == "UnpackMin")
{
for (int j = 0; j < UnpackNum; j++)
{
buffer.WriteValueS64(pcc.AddName(prop.Name));
buffer.WriteValueS64(pcc.AddName(prop.TypeVal.ToString()));
buffer.WriteValueS32(prop.Size);
buffer.WriteValueS32(j);
buffer.WriteValueF32(prop.Value.FloatValue, Endian.Little);
}
continue;
}
buffer.WriteValueS64(pcc.AddName(prop.Name));
if (prop.Name == "None")
{
for (int j = 0; j < 12; j++)
buffer.WriteByte(0);
}
else
{
buffer.WriteValueS64(pcc.AddName(prop.TypeVal.ToString()));
buffer.WriteValueS64(prop.Size);
switch (prop.TypeVal)
{
case SaltPropertyReader.Type.IntProperty:
buffer.WriteValueS32(prop.Value.IntValue);
break;
case SaltPropertyReader.Type.BoolProperty:
buffer.Seek(-4, SeekOrigin.Current);
buffer.WriteValueS32(prop.Value.IntValue);
buffer.Seek(4, SeekOrigin.Current);
break;
case SaltPropertyReader.Type.NameProperty:
buffer.WriteValueS64(pcc.AddName(prop.Value.StringValue));
break;
case SaltPropertyReader.Type.StrProperty:
buffer.WriteValueS32(prop.Value.StringValue.Length + 1);
foreach (char c in prop.Value.StringValue)
buffer.WriteByte((byte)c);
buffer.WriteByte(0);
break;
case SaltPropertyReader.Type.StructProperty:
buffer.WriteValueS64(pcc.AddName(prop.Value.StringValue));
foreach (SaltPropertyReader.PropertyValue value in prop.Value.Array)
buffer.WriteValueS32(value.IntValue);
break;
case SaltPropertyReader.Type.ByteProperty:
buffer.WriteValueS32(pcc.AddName(prop.Value.StringValue));
buffer.WriteValueS32(prop.Value.IntValue);
break;
case SaltPropertyReader.Type.FloatProperty:
buffer.WriteValueF32(prop.Value.FloatValue, Endian.Little);
break;
default:
throw new FormatException("unknown property");
}
}
}
buffer.WriteValueS32((int)(pccOffset + buffer.Position + 4));
//Remove empty textures
List<ImageInfo> tempList = new List<ImageInfo>();
foreach (ImageInfo imgInfo in imgList)
{
if (imgInfo.storageType != storage.empty)
tempList.Add(imgInfo);
}
imgList = tempList;
numMipMaps = (uint)imgList.Count;
buffer.WriteValueU32(numMipMaps);
foreach (ImageInfo imgInfo in imgList)
{
//.........这里部分代码省略.........