2.各数据类型转字节数据

2.各数据类型转字节数据


2.1 知识点

回顾C#知识——不同变量类型

  • 有符号整数类型:
    • sbyte:有符号的8位整数,取值范围为-128到127。
    • int:有符号的32位整数,取值范围为-2,147,483,648到2,147,483,647。
    • short:有符号的16位整数,取值范围为-32,768到32,767。
    • long:有符号的64位整数,取值范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807。
  • 无符号整数类型:
    • byte:无符号的8位整数,取值范围为0到255。
    • uint:无符号的32位整数,取值范围为0到4,294,967,295。
    • ushort:无符号的16位整数,取值范围为0到65,535。
    • ulong:无符号的64位整数,取值范围为0到18,446,744,073,709,551,615。
  • 浮点数类型:
    • float:单精度浮点数,占用32位,用于表示小数,取值范围大约为±1.5 x 10^-45到±3.4 x 10^38。
    • double:双精度浮点数,占用64位,用于表示更大范围的小数,取值范围大约为±5.0 x 10^-324到±1.7 x 10^308。
    • decimal:高精度的小数,占用128位,适用于财务和货币计算,取值范围大约为±1.0 x 10^-28到±7.9 x 10^28。
  • 特殊类型:
    • bool:布尔值,表示真或假。
    • char:字符类型,表示单个Unicode字符。
    • string:字符串类型,表示一串Unicode字符组成的文本。

回顾C#知识——变量的本质

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

2进制文件读写的本质

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

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

  • C#提供了一个公共类帮助我们进行转化,我们只需要记住API即可。
  • 类名:BitConverter,命名空间:using System。

BitConverter.GetBytes 将各类型转字节,可以传入各个类型的变量作为参数。

//BitConverter.GetBytes方法 将各类型转字节 可以传入各个类型的变量作为参数
byte[] bytes = BitConverter.GetBytes(257);

BitConverter.ToXX 字节数组转各类型

//BitConverter.ToXX方法 字节数组转各类型 第二个参数是从数组的第几个字节开始转换
//注意:这里需要确保数组长度至少为4,否则会抛出ArgumentOutOfRangeException异常
int i = BitConverter.ToInt32(bytes, 0); //修改了起始索引为0,表示从最低有效字节开始转换 假如传入1 就只有3个字节给系统转换导致报错 
print(i);//257

标准编码格式

  • 编码是一种将文字、数字或其它对象转换成二进制数据的方法,以便于计算机存储和处理。
  • 不同的编码格式有不同的转换规则,因此需要统一和标准化,才能保证编码的正确性和互通性。
  • 常见的编码格式有 ASCII、ANSI、GBK、GB2312、UTF-8、GB18030 和 UNICODE 等。

说人话

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

游戏开发中常用编码格式 UTF-8

  • 中文相关编码格式 GBK
  • 英文相关编码格式 ASCII

在C#中有一个专门的Encoding类来帮助我们将字符串和字节数组进行转换

  • 类名:Encoding
  • 需要引用命名空间:using System.Text;

Encoding.UTF8.GetBytes 将字符串以指定编码格式转字节

byte[] bytes2 = Encoding.UTF8.GetBytes("林文韬");

Encoding.UTF8.GetString 字节数组以指定编码格式转字符串

string s1 = Encoding.UTF8.GetString(bytes2);
string s2 = Encoding.UTF8.GetString(bytes2, 0, bytes2.Length);//这种重载可以指定从数组的哪个位置开始转换,以及转换多少个字节
print(s1);//林文韬

总结

  • 我们可以通过 BitConverter 和 Encoding 类将所有 C# 提供给我们的数据类型和字节数组之间进行相互转换了。
  • 我们需要熟练掌握其中的 API。

2.2 知识点代码

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;

public class Lesson02_各数据类型转字节数据 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 回顾C#知识——不同变量类型
        //不同变量类型
        //有符号 sbyte int short long

        //无符号 byte uint ushort ulong

        //浮点 float double decimal

        //特殊 bool char string

        #endregion

        #region 知识点二 回顾C#知识——变量的本质

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

        #endregion

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

        #region 知识点四 各类型数据和字节数据相互转换
        //C#提供了一个公共类帮助我们进行转化
        //我们只需要记住API即可
        //类名:BitConverter
        //命名空间:using System

        //BitConverter.GetBytes方法 将各类型转字节 可以传入各个类型的变量作为参数
        byte[] bytes = BitConverter.GetBytes(257);

        //BitConverter.ToXX方法 字节数组转各类型 第二个参数是从数组的第几个字节开始转换
        //注意:这里需要确保数组长度至少为4,否则会抛出ArgumentOutOfRangeException异常
        int i = BitConverter.ToInt32(bytes, 0); //修改了起始索引为0,表示从最低有效字节开始转换 假如传入1 就只有3个字节给系统转换导致报错 
        print(i);//257

        #endregion

        #region 知识点五 标准编码格式

        //编码是一种将文字、数字或其它对象转换成二进制数据的方法,以便于计算机存储和处理。
        //不同的编码格式有不同的转换规则,因此需要统一和标准化,才能保证编码的正确性和互通性。
        //常见的编码格式有ASCII、ANSI、GBK、GB2312、UTF-8、GB18030和UNICODE等。

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

        // 游戏开发中常用编码格式 UTF-8
        // 中文相关编码格式 GBK
        // 英文相关编码格式 ASCII

        // 在C#中有一个专门的Encoding类 来帮助我们将字符串和字节数组进行转换
        // 类名:Encoding
        // 需要引用命名空间:using System.Text;

        //Encoding.UTF8.GetBytes方法 将字符串以指定编码格式转字节
        byte[] bytes2 = Encoding.UTF8.GetBytes("林文韬");

        //Encoding.UTF8.GetString方法 字节数组以指定编码格式转字符串
        string s1 = Encoding.UTF8.GetString(bytes2);
        string s2 = Encoding.UTF8.GetString(bytes2, 0, bytes2.Length);//这种重载可以指定从数组的哪个位置开始转换,以及转换多少个字节
        print(s1);//林文韬

        #endregion

        #region 总结
        //我们可以通过BitConverter和Encoding类
        //将所有C#提供给我们的数据类型和字节数组之间进行相互转换了
        //我们需要熟练掌握其中的API
        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏