C# 之工控机数据类型 高低位(大小端)、BitConverter、IsLittleEndian、字节数组转换(高低位)

时间:2024-07-20 11:51:55

八种基本数据类型:byte、short、int、long、float、double、boolean、char

byte

8位、有符号的以二进制补码表示的整数
min : -128(-2^7)
max: 127(2^7-1)
default: 0
对应包装类:Byte
在这里插入图片描述

short

16位、有符号的以二进制补码表示的整数
min : -32768(-2^15)
max: 32767(2^15 - 1)
default: 0
对应包装类:Short

int

32位、有符号的以二进制补码表示的整数
min : -2,147,483,648(-2^31)
max: 2,147,483,647(2^31 - 1)
default: 0
对应包装类:Integer

long

64位、有符号的以二进制补码表示的整数
min : -9,223,372,036,854,775,808(-2^63)
max: 9,223,372,036,854,775,807(2^63 -1)
default: 0
对应的包装类:Long

float

单精度、32位、符合IEEE 754标准的浮点数
float 在储存大型浮点数组的时候可节省内存空间
浮点数不能用来表示精确的值,如货币 要用 decimal
default: 0.0f
对应的包装类:Float

double

双精度、64位、符合IEEE 754标准的浮点数
浮点数的默认类型为double类型
double类型同样不能表示精确的值,如货币
default: 0.0d
对应的包装类:Double

char 一个字节 8位

char类型是一个单一的 16 位 Unicode 字符
最小值是 \u0000(即为0)
最大值是 \uffff(即为65,535)
char 数据类型可以储存任何字符
对应的包装类:Character

boolean

boolean数据类型表示一位的信息
只有两个取值:true 和 false
这种类型只作为一种标志来记录 true/false 情况
对应的包装类:Boolean

BitConverter.IsLittleEndian

BitConverter.IsLittleEndian
》》True 小端高端 存储数据
》》False 高端低端 存储数据

大小端转换

因Modbus协议 都是高位地位请求,发送 数据的
在这里插入图片描述
BitConverter.IsLittleEndian 本人电脑显示 True, 则 表示 数据存储是 地位 高位 方式存储在电脑之中的

int 300 对应的 二进制 0000 0001 0010 1100

在这里插入图片描述

如果用 高位 地位 方法存储

在这里插入图片描述

//方法1
 private ushort ReversalHighLow(ushort val)
        {
            if (BitConverter.IsLittleEndian)
            {
                byte[] arrSrc = BitConverter.GetBytes(val);
                byte[] arrDst = new byte[arrSrc.Length];
                arrDst[0] = arrSrc[1];
                arrDst[1] = arrSrc[0];
                return BitConverter.ToUInt16(arrDst, 0);
               
            }
            else
            {
                return val;
            }
        }
    
 // 调用
 ushort st = ReversalHighLow(300);

//方法二
  private ushort ReversalHighLow(ushort val)
        {
            if (BitConverter.IsLittleEndian)
            {
                byte high = (byte)((val - val % 256) / 256);  //数字减去 低8位, 得到的数字再除以256得到高8位
                byte low = (byte)(val % 256);  //数字对256取余数, 得到低8位
                byte[] change1 = { high, low };
                return BitConverter.ToUInt16(change1,0);
            }
            else
            {
                return val;
            }
        }

  // 调用
 ushort st = ReversalHighLow(300);



//方法三
 private ushort ReversalHighLow(ushort val)
        {
            if (BitConverter.IsLittleEndian)
            {

                byte[] bytes = BitConverter.GetBytes(val);
                Array.Reverse(bytes);
                return BitConverter.ToUInt16(bytes, 0);

            }
            else
            {
                return val;
            }
        }
  // 调用
 ushort st = ReversalHighLow(300);

//方法3 
  private ushort ReversalHighLow(ushort val)
        {
            if (BitConverter.IsLittleEndian)
            {
				// 右移8位获取高字节
                byte highByte = (byte)(val >> 8); 
                // &是按位与运算符(同时1则1,否则0),
                // 与16位,高8位是000000000, 低8位是 11111111    (是高位低位方式存储)
                // 16位 ,OXFF:0000000011111111               (是高位低位方式存储)            
                byte lowByte = (byte)(val & 0xFF); 
                byte[] bytes = { highByte, lowByte };
                return BitConverter.ToUInt16(bytes,0);
            }
            else
            {
                return val;
            }
        }

 // 调用
 ushort st = ReversalHighLow(300);


字节数组转换 bool数组

在这里插入图片描述

在这里插入图片描述

 private List<bool> GetBitFromByte(byte[] val )
        {
            List<bool> bits = new List<bool>();
            for (int i = 0; i < val.Length; i++)
            {
                if (BitConverter.IsLittleEndian)
                {
                    for (int j = 7; j >= 0; j--)
                    {
                        bits.Add((val[i] & 1) == 1);
                        val[i] >>= 1;
                    }
                }
                else
                {
                    for (int j = 0; j <= 7; j++)
                    {
                        bits.Add((val[i] & 1) == 1);
                        val[i] >>= 1;
                    }
                }
               
            }
            return bits;
        }

//调用
  List<bool> bts = GetBitFromByte(BitConverter.GetBytes((ushort)500));

字节数组转成short

在这里插入图片描述