WriteBytes() public method

public WriteBytes ( byte v ) : void
v byte
return void
示例#1
0
        /// <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);
        }
示例#2
0
 public override void Encode(ByteBuffer bb)
 {
     bb.WriteBytes(dh_data);
     bb.WriteBool(s2cneedcompress);
     bb.WriteBool(c2sneedcompress);
 }
示例#3
0
 public override void Encode(ByteBuffer bb)
 {
     bb.WriteByte(dh_group);
     bb.WriteBytes(dh_data);
 }
示例#4
0
        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);
        }
示例#5
0
        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);
            }
        }
示例#6
0
        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 }));
        }