【Unity】数据持久化--二进制 ,文件操作

1、各字节类型转字节数组

1.1 不同变量类型

  • 有符号 sbyte int short long
  • 无符号 byte uint ushort ulong
  • 浮点 float double decimal
  • 特殊 bool char string

1.2 变量的本质

  • 变量的本质是2进制
  • 在内存中都以字节的形式存储着
  • 1byte = 8bit
  • 1bit(位)不是0就是1
        //通过sizeof方法可以看到常用变量类型占用的字节空间长度print("有符号");print("sbyte" + sizeof(sbyte) + "字节");print("int" + sizeof(int) + "字节");print("short" + sizeof(short) + "字节");print("long" + sizeof(long) +"字节");print("无符号");print("byte" + sizeof(byte) + "字节");print("uint" + sizeof(uint) + "字节");print("ushort" + sizeof(ushort) +"字节");print("ulong" + sizeof(ulong) + "字节");print("浮点");print("float" + sizeof(float) + "字节");print("double" + sizeof(double) + "字节");print("decimal" + sizeof(decimal) + "字节");print("特殊");print("bool" + sizeof(bool) + "字节");print("char" + sizeof(char) + "字节");

1.3 二进制文件读写的本质

  • 它就是通过将各类型变量转换为字节数组
  • 将字节数组直接存储到文件中
  • 一般人是看不懂存储的数据的
  • 不仅可以节约存储空间,提升效率
  • 还可以提升安全性
  • 而且在网络通信中我们直接传输的数据也是字节数据 (2进制数据)

1.4 各类型数据和字节数据相互转换

  • C#提供了一个公共类帮助我们进行转化
  • 类名:BitConverter
  • 命名空间:using system

将各类型转字节

BitConverter.GetBytes()

字节数组转各类型,不同类型使用不同方法

BitConverter.ToInt32 (bytes, 0)

        BitConverter.ToBoolean (bytes, 1);BitConverter.ToChar (bytes, 1);BitConverter.ToDouble (bytes, 1);BitConverter.ToInt16 (bytes, 1);BitConverter.ToInt32 (bytes, 1);BitConverter.ToInt64 (bytes, 1);BitConverter.ToSingle (bytes, 1);BitConverter.ToUInt16 (bytes, 1);BitConverter.ToUInt32 (bytes, 1);BitConverter.ToUInt64 (bytes, 1);//1.将各类型转字节byte[] bytes = BitConverter.GetBytes(256);//2.字节数组转各类型int i = BitConverter.ToInt32 (bytes, 0);Debug.Log(i);

1.5 标准编码格式

  • 编码是用预先规定的方法将文字、 数字或其它对象编成数码,或将信息、 数据转换成规定的电脉冲信号
  • 为保证编码的正确性,编码要规范化、标准化,即需有标准的编码格式。
  • 常见的编码格式有ASCII、ANSI、GBK、GB2312、UTF-8、GB18030和UNICODE等

直白解释

  • 计算机中数据的本质就是2进制数据
  • 编码格式就是用对应的2进制数 对应不同的文字
  • 由于世界上有各种不同的语言,所有会有很多种不同的编码格式
  • 不同的编码格式 对应的规则是不同的
  • 如果在读取字符时采用了不统一的编码格式,可能会出现乱码

  • 游戏开发中常编码格式 UTF-8
  • 中文相关编码格式 GBK
  • 英文相关编码格式 ASCII
  • 在c#中有一个专门的编码格式类 来帮助我们将字符串和字节数组进行转换

类名:Encoding

需要引用命名空间:using system.Text;

将字符串以指定编码格式转字节

Encoding.UTF8.GetBytes(字符串)

字节数组以指定编码格式转字符串

Encoding.UTF8.GetString (字节数组)

        //1.将字符串以指定编码格式转字节byte[] bytes2 = Encoding.UTF8.GetBytes("周涛涛");//2.字节数组以指定编码格式转字符串string s = Encoding.UTF8.GetString (bytes2);//string s = Encoding.UTF8.GetString (bytes2, 0, bytes2.Length);Debug.Log(s);

2、文件操作相关

2.1 代码中的文件操作

  • 在电脑上我们可以在操作系统中创建删除修改文件
  • 可以增删查改各种各样的文件类型
  • 代码中的文件操作就是通过代码来做这些事情

2.2 文件相关操作公共类

  • C#提供了一个名为File(文件)的公共类
  • 让我们可以快捷的通过代码操作文件相关
  • 类名:Fi1e
  • 命名空间: System.Io

2.3 文件操作File类的常用内容

判断文件是否存在        File.Exists("文件路径")

创建文件        File.Create("文件路径")

写入文件        File.WriteAllBytes("路径", 字节数组)

读取文件        

读取字节数据        File.ReadAllBytes("路径")

读取所有行信息        File.ReadAllLines("路径")

读取所有文本信息        File.ReadAllText("路径")

删除文件        File.Delete("路径")

复制文件        File.Copy(现有文件, 目标文件)

文件替换        File.Replace(用来替换的路径, 被替换的路径, 备份路径)

以流的形式 打开文件并写入或读取 FileStream fs = File.Open(路径, 打开模式, 访问模式)

        //1.判断文件是否存在//File.Exists("文件路径");if(File.Exists(Application.persistentDataPath + "/文件")){Debug.Log("文件存在");}else{Debug.Log("文件不存在");}//2.创建文件//FileStream fs = File.Create(Application.dataPath + "/UnityTeach.tang");//3.写入文件//将指定字节数组 写入到指定路径的文件中byte[] bytes = BitConverter.GetBytes(999);File.WriteAllBytes(Application.dataPath + "/UnityTeach.tang", bytes);//将指定的string数组内容 一行行写入到指定路径中string[] strs = new string[] { "123", "2313", "2323" };File.WriteAllLines(Application.dataPath + "/UnityTeach2.tang", strs);//将指定字符串写入指定路径File.WriteAllText(Application.dataPath + "/UnityTeach3.tang", "小帅哥12313\n\t说的就是简单介绍");//4.读取文件//读取字节数据bytes = File.ReadAllBytes(Application.dataPath + "/UnityTeach.tang");Debug.Log(BitConverter.ToInt32(bytes, 0));//读取所有行信息strs = File.ReadAllLines(Application.dataPath + "/UnityTeach2.tang");for (int i = 0; i < strs.Length; i++){Debug.Log(strs[i]);}//读取所有文本信息string s = File.ReadAllText(Application.dataPath + "/UnityTeach3.tang");Debug.Log(s);//5.删除文件//注意 如果删除打开着的文件 会报错File.Delete(Application.dataPath + "/UnityTeach.tang");//6.复制文件//参数一:现有文件 需要是流关闭状态//参数二:目标文件File.Copy(Application.dataPath + "/UnityTeach2.tang", Application.dataPath + "/唐老师.tanglaoshi", true);//7.文件替换//参数一: 用来替换的路径//参数二: 被替换的路径//参数三: 备份路径File.Replace(Application.dataPath + "/UnityTeach2.tang", Application.dataPath + "/唐老师.tanglaoshi", Application.dataPath + "/唐老师备份.tanglaoshi");//8.以流的形式 打开文件并写入或读取//参数一:路径//参数二:打开模式//参数三:访问模式FileStream fs = File.Open(Application.dataPath + "/UnityTeach2.tang", FileMode.OpenOrCreate, FileAccess.ReadWrite);

2.4 总结

  • File类提供了各种方法帮助我们进行文件的基础操作,需要记住这些关键API
  • 一般情况下想要整体读写内容 可以使用File提供的write和Read相关功能

3、文件流操作相关

3.1 什么是文件流

  • 在C#中提供了一个文件流类 FileStream类
  • 它主要作用是用于读写文件的细节
  • 我们之前学过的Fi1e只能整体读写文件
  • 而Filestream可以以读写字节的形式处理文件

直白解释

  • 文件里面存储的数据就像是一条数据流(数组或者列表)
  • 我们可以通过FileStream 一部分一部分的读写数据流
  • 比如我可以先存一个int(4个字节)再存一个bo01(1个字节)再存一个string(n个字节)
  • 利用Filestream可以以流式逐个读写

3.2 FileStream文件流类常用方法

  • 类名:FileStream
  • 需要引用命名空间:system.

3.2.1 打开或创建指定文件

方法一 new FileStream

  • 参数一:路径
  • 参数二:打开模式
    • CreateNew: 创建新文件 如果文件存在 则报错
    • Create: 创建文件,如果文件存在 则覆盖
    • Open: 打开文件,如果文件不存在 报错
    • Openorcreate: 打开或者创建文件根据实际情况操作
    • Append:若存在文件,则打开并查找文件尾,或者创建一个新文件
    • Truncate:打开并清空文件内容
  • 参数三:访问模式
  • 参数四:共享权限
    • None 谢绝共享
    • Read 允许别的程序读取当前文件
    • Write 允许别的程序写入该文件
    • Readwrite 允许别的程序读写该文件
FileStream fs = new FileStream(Application.dataPath + "/Lesson3.tang", FileMode.Create, FileAccess.ReadWrite);

方法二: File.create

  • 参数一: 路径
  • 参数二: 缓存大小
  • 参数三:描述如何创建或覆盖该文件(不常用)
    • Asynchronous 可用于异步读写
    • DeleteOnClose 不在使用时,自动删除
    • Encrypted 加密
    • None 不应用其它选项
    • RandomAccess 随机访问文件
    • SequentialScan 从头到尾顺序访问文件
    • WriteThrough 通过中间缓存直接写入磁盘 
FileStream fs2 = File.Create(Application.dataPath + "/Lesson3.tang", 2048);

方法三: File.open

  • 参数一: 路径
  • 参数二: 打开模式
FileStream fs3 = File.Open(Application.dataPath + "/Lesson3.tang", FileMode.Open);

3.2.3 重要属性和方法

文本字节长度        fs.Length

是否可写        fs.CanWrite

是否可读        fs.CanRead

将字节写入文件 当写入后 一定执行一次        fs.Flush();

关闭流 当文件读写完毕后 一定执行        fs.Close();

缓存资源销毁回收        fs.Dispose();

3.2.4 写入字节

using(FileStream fs = new FileStream(Application.persistentDataPath + "/Lesson3.tang", FileMode.OpenOrCreate, FileAccess.ReadWrite)){Debug.Log(Application.persistentDataPath);byte[] bytes = BitConverter.GetBytes(9999);//方法:write//参数一: 写入的字节数组//参数二: 数组中的开始索引//参数三:写入多少个字节fs.Write(bytes, 0, 4);//写入字符串时bytes = Encoding.UTF8.GetBytes("你是个啥子");//先写入长度int length = bytes.Length;fs.Write(BitConverter.GetBytes(length), 0, 4);//再写入字符串具体内容fs.Write(bytes, 0, length);//避免数据丢失 一直要执行一次的方法fs.Flush();fs.Dispose();}

读取字节

        #region 方法一:挨个读取字节数组using(FileStream fs2 = File.Open(Application.persistentDataPath + "/Lesson3.tang", FileMode.Open, FileAccess.Read)){//读取第一个整形byte[] bytes2 = new byte[4];//参数一: 用于存储读取的字节数组的容器//参数二: 容器中开始的位置//参数三: 读取多少个字节装入容器//返回值: 当前流索引前进了几个位置int index = fs2.Read(bytes2, 0, 4);int i = BitConverter.ToInt32(bytes2, 0);Debug.Log("取出来的第一个整数" + i);//9999Debug.Log("索引向前移动" + index + "个位置");//读取第二个字符串//读取字符串字节数组长度index = fs2.Read(bytes2, 0, 4);Debug.Log("索引向前移动" + index + "个位置");int length2 = BitConverter.ToInt32(bytes2, 0);//要根据我们存储的字符串字节数组长度 来声明一个字节数组 用来装载读取出来的数据bytes2 = new byte[length2];index = fs2.Read(bytes2, 0, length2);Debug.Log("索引向前移动" + index + "个位置");//得到最终的字符串 打印出来Debug.Log(Encoding.UTF8.GetString(bytes2));fs2.Dispose();}#endregion#region 方法二:一次性读取再挨个读取Debug.Log("***********************");using(FileStream fs3 = File.Open(Application.persistentDataPath + "/Lesson3.tang", FileMode.OpenOrCreate, FileAccess.Read)){//一开始就声明一个 和文件字节数组长度一样的容器byte[] bytes3 = new byte[fs3.Length];fs3.Read(bytes3, 0, (int)fs3.Length);fs3.Dispose();//读取整数Debug.Log(BitConverter.ToInt32(bytes3, 0));//读取字符串字节数组长度int length3 = BitConverter.ToInt32(bytes3, 4);//得到字符串Debug.Log(Encoding.UTF8.GetString(bytes3, 8, length3));}#endregion

3.3 更加安全的使用文件流对象

  • using头键字重要用法
  • using(申明一个引用对象)
  • {
  •         使用对象
  • }
  • 无论发生什么情况 当using语句块结束后
  • 会自动调用该对象的销毁方法 避免忘记销毁或关闭流
  • using是一种更安全的使用方法

强调:

目前我们对文件流进行操作 为了文件操作安全 都用using来进行处理最好

3.4 总结

  • 通过FIlestream读写时一定要注意
  • 读的规则一定是要和写是一致的
  • 我们存储数据的先后顺序是我们制定的规则
  • 只要按照规则读写就能保证数据的正确性

4、文件夹操作相关

4.1 文件夹操作是指什么

  • 平时我们可以在操作系统的文件管理系统中
  • 通过一些操作增删查改文件夹
  • 我们目前要学习的就是通过代码的形式
  • 来对文件夹进行增删查改的操作

4.2 C#提供给我们的文件夹操作公共类

  • 类名:Directory
  • 命名空间:using system.I0
  • 判断文件夹是否存在        Directory.Exists
  • 创建文件夹        Directory.CreateDirectory
  • 删除文件夹        Directory.Delete(路径, 是否删除非空目录)
  • 查找文件夹和文件
    • 得到指定路径下所有文件夹名        Directory.GetDirectories
    • 得到指定路径下所有文件名        Directory.GetFiles
  • 移动文件夹        Directory.Move()  如果第二个参数所在的路径 已经存在了一个文件夹 那么会报错

4.3 DirectoryInfo和FileInfo

  • DirectoryInfo日录信息类
  • 我们可以通过它获取文件夹的更多信息

它主要出现在两个地方

创建文件夹方法的返回值

        DirectoryInfo dInfo = Directory.CreateDirectory(Application.dataPath + "/数据持久化122");//全路径Debug.Log(dInfo.FullName);//文件名Debug.Log(dInfo.Name);

查找上级文件夹信息

        dInfo = Directory.GetParent(Application.dataPath + "/数据持久化122");//全路径Debug.Log(dInfo.FullName);//文件名Debug.Log(dInfo.Name);

得到所有子文件夹的目录信息

        DirectoryInfo[] dInfos = dInfo.GetDirectories();
  • FileInfo文件信息类

我们可以通过DirectoryInfo得到该文件下的所有文件信息

        FileInfo[] fInfos = dInfo.GetFiles();foreach (FileInfo fi in fInfos){Debug.Log("******************");Debug.Log(fi.Name);//文件名Debug.Log(fi.FullName);//路径Debug.Log(fi.Length);//字节长度Debug.Log(fi.Extension);//后缀名}

5、C#类对象的序列化

5.1 序列化类对象第一步-申明类对象

注意:如果要使用c#自带的序列化2进制方法

申明类时需要添加[System.Serializable]特性

5.2 序列化类对象第二步-将对象进行2进制序列化

方法一:使用内存流得到2进制字节数组
主要用于得到字节数组 可以用于网络传输

  • 内存流对象
    • 类名:MemoryStream
    • 命名空间:system.I0
  • 进制格式化对象
    • 类名:BinaryFormatter
    • 命名空间:System.Runtime.Serialization.Formatters.Binary.
    • 主要方法:序列化方法 Serialize
        using (MemoryStream ms = new MemoryStream()){//二进制格式化程序BinaryFormatter bf = new BinaryFormatter();//序列化对象 生成2进制字节数组 写入到内存流当中bf.Serialize(ms, p);//得到对象的二进制字节数组byte[] bytes = ms.GetBuffer();//存储字节File.WriteAllBytes(Application.dataPath + "/Lesson5.zhou", bytes);//关闭内存流ms.Close();}

方法二:使用文件流进行存储
主要用于存储到文件中

        using(FileStream fs = new FileStream(Application.dataPath + "/Lesson5_2.zhou", FileMode.OpenOrCreate, FileAccess.Write)){BinaryFormatter bf = new BinaryFormatter();bf.Serialize(fs, p);fs.Flush();fs.Close();}

5.3 总结

c#提供的类对象2进制序列化主要类是 BinaryFormatter
通过其中的序列化方法即可进行序列化生成字节数组

6、C#类对象的反序列化

6.1 反序列化文件中数据

  • 主要类
    • Filestream文件流类
    • BinaryFormatter 2进制格式化类
  • 主要方法
    • Deserizlize
        //通过文件流打开指定的2进制数据文件using (FileStream fs = new FileStream(Application.dataPath + "/Lesson5_2.zhou", FileMode.Open, FileAccess.Read)){//声明一个 二进制格式化类BinaryFormatter bf = new BinaryFormatter();//反序列化Person p = bf.Deserialize(fs) as Person;fs.Close();}

6.2 反序列化网络传输过来的2进制数据

  • 主要类
    • Memorysteeam内存流类
    • BinaryFormatter 2进制格式化类
  • 主要方法
    • Deserizlize
        //日前没有网络传输 我们还是直接从文件中获取byte[] bytes = File.ReadAllBytes(Application.dataPath + "/Lesson5_2.zhou");//声明内存流对象 一开始就把字节数组传输进去using(MemoryStream ms = new MemoryStream(bytes)){//声明一个 二进制格式化类BinaryFormatter bf = new BinaryFormatter();//反序列化Person p = bf.Deserialize(ms) as Person;ms.Close();}

7、二进制数据加密

7.1 何时加密?何时解密?

  • 当我们将类对象转换为2进制数据时进行加密
  • 当我们将2进制数据转换为类对象时进行解密
  • 这样如果第三方获取到我们的2进制数据
  • 当他们不知道加密规则和解密秘钥时就无法获取正确的数据
  • 起到保证数据安全的作用

7.2 加密是否是100%安全?

  • 一定记住加密只是提高破解门槛,没有100%保密的数据
  • 通过各种尝试始终是可以破解加密规则的,只是时间问题
  • 加密只能起到提升一定的安全性

7.3 常用加密算法

  • MD5算法
  • SHA1算法
  • HMAC算法
  • AES/DES/3DES算法
  • 等等等

7.4 用简单的异或加密感受加密的作用

        Person p = new Person();byte key = 199;using(MemoryStream ms = new MemoryStream()){BinaryFormatter bf = new BinaryFormatter();bf.Serialize(ms, p); byte[] bytes = ms.GetBuffer();//异或加密for(int i = 0; i < bytes.Length; i++){bytes[i] ^= key;}File.WriteAllBytes(Application.dataPath + "/Lesson7.zhou", bytes);}byte[] bytes1 = File.ReadAllBytes(Application.dataPath + "/Lesson7.zhou");for(int i = 0;i < bytes1.Length; i++){bytes1[i] ^= key;}using (MemoryStream ms = new MemoryStream(bytes1)){BinaryFormatter bf = new BinaryFormatter();Person p2 = bf.Deserialize(ms) as Person;}

8、二进制数据管理器

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;/// <summary>
/// 2进制数据管理器
/// </summary>
public class BinaryDataMgr
{private static BinaryDataMgr instance = new BinaryDataMgr();public static BinaryDataMgr Instance => instance;private BinaryDataMgr() { }private static string SAVE_PATH = Application.persistentDataPath + "/Data/";/// <summary>/// 存储类对象数据/// </summary>/// <param name="data"></param>/// <param name="fileName"></param>public void Save(object data, string fileName){if(!Directory.Exists(SAVE_PATH)){Directory.CreateDirectory(SAVE_PATH);}using(FileStream fs = new FileStream(SAVE_PATH + fileName + ".zhou", FileMode.OpenOrCreate, FileAccess.Write)){BinaryFormatter bf = new BinaryFormatter();bf.Serialize(fs, data);fs.Flush();fs.Close();}}/// <summary>/// 读取2进制数据转换成对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="fileName"></param>/// <returns></returns>public T Load<T>(string fileName) where T : class{if(!File.Exists(SAVE_PATH + fileName + ".zhou")){return default(T);}T data;using(FileStream fs = new FileStream(SAVE_PATH + fileName + ".zhou", FileMode.Open, FileAccess.Read)){BinaryFormatter bf = new BinaryFormatter();data = bf.Deserialize(fs) as T;fs.Close();}return data;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/33986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决node: bad option: -V

出现这个问题是由于我们的不当操作造成的&#xff0c;v是需要小写的&#xff0c;看下图 node --version node -v

P2P文件传输协议之BitTorrent协议

P2P文件传输协议中的BitTorrent协议是一种用于高效地下载和上传大型文件的点对点&#xff08;P2P&#xff09;传输协议。以下是关于BitTorrent协议的详细说明&#xff1a; 一、技术原理 分布式系统&#xff1a;BitTorrent是一个分布式系统&#xff0c;没有中央服务器。相反&a…

缓存双写一致性(笔记)

缓存更新方案 旁路缓存模式 这是比较多的 旁路缓存模式&#xff1a;缓存有就返回&#xff0c;没有数据库查询&#xff0c;放入缓存返回。 还有些常用缓存策略 读穿透模式 读穿透和旁路很相似&#xff0c;程序不需要关注从哪里读取数据&#xff0c;它只需要从缓存查询数据。…

MySQL中什么是索引合并?

索引合并是数据库查询优化的一种技术&#xff0c;它允许数据库管理系统在处理查询时&#xff0c;利用多个索引来改进数据检索的效率。这种技术主要应用在那些设计多个条件的查询中&#xff0c;通过合并多个索引的结果集&#xff0c;找出最终满足所有条件的数据行。 在MySQL中如…

ts 中定义多个数据

let a :{name:string,[xx:string]:any} a {name:小明,age:28,gender:男} 正确 a {name:111,age:28,gender:男} 错误&#xff0c;name必须是字符串 //这句话的意思就是a对象中 name是必填的并且只能是字符串&#xff0c;后面属性名是字符串&#xf…

从概念到现实:数字孪生技术在智慧充电站的实践

在电动汽车蓬勃发展的今天&#xff0c;充电基础设施的智能化升级成为了推动新能源汽车产业跃进的关键一环。数字孪生技术&#xff0c;作为智能制造和工业4.0的核心&#xff0c;正在逐渐渗透到智慧充电站的每一个角落——从提高能源效率到增强用户体验&#xff0c;为智慧充电站的…

vuex数据持久化

清空原因&#xff1a; 刷新页面vuex的数据会丢失属于正常现象&#xff0c;因为JS的数据都是保存在浏览器的堆栈内存里面的&#xff0c;刷新浏览器页面&#xff0c;以前堆栈申请的内存被释放&#xff0c;这就是浏览器的运行机制&#xff0c;那么堆栈里的数据自然就清空了。 解…

【快慢指针】个人练习-Leetcode-142. Linked List Cycle II

题目链接&#xff1a;https://leetcode.cn/problems/linked-list-cycle-ii/description/ 题目大意&#xff1a;给一个链表的头部&#xff0c;判断链表是否有环&#xff0c;如果有&#xff0c;返回环的第一个指针&#xff1b;如果没有&#xff0c;返回nullptr 思路&#xff1a…

强化学习-RLHF-PPO入门

一、定义 强化学习微调分类RM模型 数据集格式训练流程Reward 模型训练流程(分类模型&#xff0c;积极为1&#xff0c;消极为0) AutoModelForSequenceClassificationReward 模型训练案例PPO模型训练流程PPO模型训练案例 二、实现 强化学习微调分类 RLHF:基于人类反馈对语言模型…

python,ipython 和 jupyter notebook 之间的关系

python&#xff0c;ipython 和 jupyter notebook 之间的关系 文章目录 python&#xff0c;ipython 和 jupyter notebook 之间的关系1. Python2. IPython3. Jupyter Notebook启动 Jupyter Notebook 关系总结 Python、IPython 和 Jupyter Notebook 是相互关联但具有不同功能的工具…

机器学习之数学基础(七)~过拟合(over-fitting)和欠拟合(under-fitting)

目录 1. 过拟合与欠拟合 1.1 Preliminary concept 1.2 过拟合 over-fitting 1.3 欠拟合 under-fitting 1.4 案例解析&#xff1a;黑天鹅 1. 过拟合与欠拟合 1.1 Preliminary concept 误差 经验误差&#xff1a;模型对训练集数据的误差。泛化误差&#xff1a;模型对测试…

【可控图像生成系列论文(四)】IP-Adapter 具体是如何训练的?1公式篇

系列文章目录 【可控图像生成系列论文&#xff08;一&#xff09;】 简要介绍了 MimicBrush 的整体流程和方法&#xff1b;【可控图像生成系列论文&#xff08;二&#xff09;】 就MimicBrush 的具体模型结构、训练数据和纹理迁移进行了更详细的介绍。【可控图像生成系列论文&…

RabbitMQ 消息传递

消息何去何从 mandatory和immediate是channel.basicPublish方法中的两个参数&#xff0c;他们都有当消息传递过程中不可达目的地时将消息返回给生产者的功能。RabbitMQ提供的备份交换器可以将未能被交换器路由的消息&#xff08;没有绑定队列或者没有匹配的绑定&#xff09;存…

转行供应链—安全库存

安全库存&#xff08;又称保险库存&#xff09; 安全库存的定义&#xff1a; 安全库存是一种缓冲库存&#xff0c;用于应对需求波动和供应链不确定性。这些不确定因素可能包括订货期间需求的增长、到货延期等情况。其目的是在供应链出现意外问题时&#xff0c;确保企业能够持续…

学习C++第三天——对引用的深入了解

引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量共用同一块内存空间。 一个变量可以有多个引用&#xff1a; int main() {//一个变量可以有多个引用int a 10;int& b …

OpenAI 收购桌面实时协作公司 Multi;iOS 18 开放 iPhone 镜像测试丨RTE 开发者日报 Vol.231

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

c++ 设计模式 的课本范例(上)

( 0 ) 这里补充面向对象设计的几个原则&#xff1a; 开闭原则OCP &#xff1a; 面向增补开放&#xff0c;面向代码修改关闭。其实反映到代码设计上就是类的继承&#xff0c;通过继承与多态&#xff0c;可以不修改原代码&#xff0c;又增加新的类似的功能。 依赖倒置原则 Depend…

如何从iPhone恢复错误删除的照片

嘿&#xff0c;iPhone 用户&#xff01;作为一名苹果专业人士&#xff0c;我见过相当多的“哎呀&#xff0c;我删除了它&#xff01;”的时刻。今天&#xff0c;我在这里指导您完成从iPhone中恢复那些珍贵的&#xff0c;错误删除的照片的迷宫。坐下来&#xff0c;拿起你的设备&…

分压电路 ADC计算电压 【老板再也不能开除我了 】

经典分压电路 一个电压过来 adc这里的电压等于&#xff1a; 如是12位adc 那么他最大值就是4095 如参考电压是5v 则&#xff1a;5v/4095 实际电压V*(R2/(R1R2)&#xff09;/adc值 转化&#xff1a;实际电压V 5v*(adc值/4095)/(R2/(R1R2)) &#xff1a;老板再也不能 因为不会…

11.利用RTC制作实时时钟

RTC 从配置上分两大部分—时钟的配置、定时器的配置 时钟的配置&#xff1a;可以直接访问 直接由RCC的BDCR来配置时钟&#xff1a;时钟源的选择 定时器的配署&#xff1a;不可以直接访问&#xff0c;因为定时器相关的寄存器在备份区域 1、使能备份区域访问— PWREN、BKPEN …