/// <summary> /// 编码 /// </summary> public override void Encode(ByteBuffer sendBuffer, System.Object packageObj) { DefaultNetworkPackage package = (DefaultNetworkPackage)packageObj; if (package == null) { HandleError(false, $"The package object is invalid : {packageObj.GetType()}"); return; } // 检测逻辑是否合法 if (package.IsHotfixPackage) { if (package.BodyBytes == null) { HandleError(false, $"The package BodyBytes field is null : {packageObj.GetType()}"); return; } } else { if (package.MsgObj == null) { HandleError(false, $"The package MsgObj field is null : {packageObj.GetType()}"); return; } } // 获取包体数据 byte[] bodyData; if (package.IsHotfixPackage) { bodyData = package.BodyBytes; } else { bodyData = EncodeInternal(package.MsgObj); } // 检测包体长度 if (bodyData.Length > PackageBodyMaxSize) { HandleError(false, $"The package {package.MsgID} body size is larger than NetworkDefine.PackageBodyMaxSize"); return; } // 写入长度 int packetSize = (int)MessageIDFieldType + bodyData.Length; if (PackageSizeFieldType == EPackageSizeFieldType.UShort) { // 检测是否越界 if (packetSize > ushort.MaxValue) { HandleError(true, $"The package {package.MsgID} size is larger than ushort.MaxValue."); return; } sendBuffer.WriteUShort((ushort)packetSize); } else { sendBuffer.WriteInt(packetSize); } // 写入包头 { // 写入消息ID if (MessageIDFieldType == EMessageIDFieldType.UShort) { // 检测是否越界 if (package.MsgID > ushort.MaxValue) { HandleError(true, $"The package {package.MsgID} ID is larger than ushort.MaxValue"); return; } sendBuffer.WriteUShort((ushort)package.MsgID); } else { sendBuffer.WriteInt(package.MsgID); } } // 写入包体 sendBuffer.WriteBytes(bodyData, 0, bodyData.Length); }
public override void Encode(ByteBuffer bb) { bb.WriteBytes(dh_data); bb.WriteBool(s2cneedcompress); bb.WriteBool(c2sneedcompress); }
public override void Encode(ByteBuffer bb) { bb.WriteByte(dh_group); bb.WriteBytes(dh_data); }
public ByteBuffer Serialize(int reservedSize, Func <int, ByteBuffer> bufferCreator) { /// Calculate total length count int totalLen = reservedSize; foreach (var obj in _datas) { if (obj == null) { throw new Exception("Null data found in the SimpleArray!"); } if (obj is int) { totalLen += 4; } else if (obj is byte[]) { totalLen += ((byte[])obj).Length + 2; } else if (obj is bool) { totalLen += 1; } else { throw new Exception("Unsupported type!"); } } totalLen += _datas.Count; if (totalLen > 65535) { throw new Exception("Data exceed max size!"); } /// Write to buffer ByteBuffer buffer = bufferCreator(totalLen); buffer.WriteUShort((ushort)totalLen); buffer.position = buffer.position + reservedSize; foreach (var obj in _datas) { if (obj is int) { buffer.WriteByte(_DataTypes.INT); buffer.WriteInt((int)obj); } else if (obj is byte[]) { buffer.WriteByte(_DataTypes.STRING); byte[] byteArray = (byte[])obj; buffer.WriteUShort((ushort)byteArray.Length); buffer.WriteBytes(byteArray); } else if (obj is bool) { buffer.WriteByte(_DataTypes.BOOL); bool b = (bool)obj; buffer.WriteByte((byte)(b ? 1 : 0)); } else { throw new Exception("Unsupported type!"); } } return(buffer); }
private void CreatePatchManifestBytesFile(string[] allAssetBundles, Dictionary <string, List <string> > variantInfos) { ByteBuffer fileBuffer = new ByteBuffer(PatchManifest.FileStreamMaxLen); ByteBuffer tableBuffer = new ByteBuffer(PatchManifest.TableStreamMaxLen); // 加载补丁清单 PatchManifest oldPatchManifest = LoadPatchManifestFile(); // 删除旧文件 string filePath = OutputPath + $"/{PatchDefine.PatchManifestBytesFileName}"; if (File.Exists(filePath)) { File.Delete(filePath); } // 创建新文件 Log($"创建补丁清单文件:{filePath}"); // 写入版本信息 fileBuffer.WriteInt(BuildVersion); // 写入元素总数 fileBuffer.WriteInt(allAssetBundles.Length + 1); // 写入UnityManifest文件的信息 { string assetName = PatchDefine.UnityManifestFileName; string path = $"{OutputPath}/{assetName}"; string md5 = HashUtility.FileMD5(path); long sizeBytes = EditorTools.GetFileSize(path); int version = BuildVersion; List <string> variantList = null; tableBuffer.Clear(); tableBuffer.WriteUTF(assetName); tableBuffer.WriteUTF(md5); tableBuffer.WriteLong(sizeBytes); tableBuffer.WriteInt(version); tableBuffer.WriteListUTF(variantList); // 写入到总缓存 int tabSize = tableBuffer.ReadableBytes(); fileBuffer.WriteShort(PatchManifest.TableStreamHead); fileBuffer.WriteInt(tabSize); fileBuffer.WriteBytes(tableBuffer.ReadBytes(tabSize)); } // 写入所有AssetBundle文件的信息 foreach (string assetName in allAssetBundles) { string path = $"{OutputPath}/{assetName}"; string md5 = HashUtility.FileMD5(path); long sizeBytes = EditorTools.GetFileSize(path); int version = BuildVersion; string variants = GetVariants(variantInfos, assetName); List <string> variantList = null; if (string.IsNullOrEmpty(variants) == false) { variantList = variants.Split('|').ToList(); } // 注意:如果文件没有变化使用旧版本号 if (oldPatchManifest.Elements.TryGetValue(assetName, out PatchElement element)) { if (element.MD5 == md5) { version = element.Version; } } tableBuffer.Clear(); tableBuffer.WriteUTF(assetName); tableBuffer.WriteUTF(md5); tableBuffer.WriteLong(sizeBytes); tableBuffer.WriteInt(version); tableBuffer.WriteListUTF(variantList); // 写入到总缓存 int tabSize = tableBuffer.ReadableBytes(); fileBuffer.WriteShort(PatchManifest.TableStreamHead); fileBuffer.WriteInt(tabSize); fileBuffer.WriteBytes(tableBuffer.ReadBytes(tabSize)); } // 创建文件 using (FileStream fs = new FileStream(filePath, FileMode.Create)) { byte[] data = fileBuffer.Buf; int length = fileBuffer.ReadableBytes(); fs.Write(data, 0, length); } }
public ImageDebugHeader GetDebugHeader() { if (IsEmbedded) { return(new ImageDebugHeader()); } ImageDebugHeaderEntry codeViewEntry; { var codeViewDirectory = new ImageDebugDirectory() { MajorVersion = 256, MinorVersion = 20557, Type = ImageDebugType.CodeView, TimeDateStamp = (int)pdb_id_stamp, }; var buffer = new ByteBuffer(); // RSDS buffer.WriteUInt32(0x53445352); // Module ID buffer.WriteBytes(pdb_id_guid.ToByteArray()); // PDB Age buffer.WriteUInt32(1); // PDB Path var fileName = writer.BaseStream.GetFileName(); if (string.IsNullOrEmpty(fileName)) { fileName = module.Assembly.Name.Name + ".pdb"; } buffer.WriteBytes(System.Text.Encoding.UTF8.GetBytes(fileName)); buffer.WriteByte(0); var data = new byte [buffer.length]; Buffer.BlockCopy(buffer.buffer, 0, data, 0, buffer.length); codeViewDirectory.SizeOfData = data.Length; codeViewEntry = new ImageDebugHeaderEntry(codeViewDirectory, data); } ImageDebugHeaderEntry pdbChecksumEntry; { var pdbChecksumDirectory = new ImageDebugDirectory() { MajorVersion = 1, MinorVersion = 0, Type = ImageDebugType.PdbChecksum, TimeDateStamp = 0 }; var buffer = new ByteBuffer(); // SHA256 - Algorithm name buffer.WriteBytes(System.Text.Encoding.UTF8.GetBytes("SHA256")); buffer.WriteByte(0); // Checksum - 32 bytes buffer.WriteBytes(pdb_checksum); var data = new byte [buffer.length]; Buffer.BlockCopy(buffer.buffer, 0, data, 0, buffer.length); pdbChecksumDirectory.SizeOfData = data.Length; pdbChecksumEntry = new ImageDebugHeaderEntry(pdbChecksumDirectory, data); } return(new ImageDebugHeader(new ImageDebugHeaderEntry [] { codeViewEntry, pdbChecksumEntry })); }