c#硬件对接数值转换
数据处理
通过TCP连接拿到数据之后,在ReadCallback
函数里面拿到传过来的结果,是个byte[]
。一般我们需要做以下几件事情:
- 整个数组装成String,然后做日志记录,以便后续的检查
- 取数组中的某几位,转成对应的int,float,string之类的。
- 需要给client发送回复数据,所以需要把int,float之类值转成字节数组
大小端
//指示数据存储在此计算机体系结构中的字节顺序(“endianness”)
var isLittleEndian = BitConverter.IsLittleEndian;//true。小端,低位在前面。
关键对象
主要就是BitConverter
这个对象的使用,就不用自己去写什么规则了。
实现
字节数组转成
String
var str = Encoding.ASCII.GetString(new byte[] {65, 65, 65});
int,long,float,double
var intBytes = new byte[] {1, 1, 0, 0};
var a = BitConverter.ToInt32(intBytes, 0);
var longBytes = new Byte[] {1, 1, 0, 0, 0, 0, 0, 0};
var b = BitConverter.ToInt64(longBytes, 0);
var floatBytes = new Byte[] {1, 1, 0, 0};
var c = BitConverter.ToSingle(floatBytes, 0);
var doubleBytes = new Byte[] {1, 1, 0, 0, 0, 0, 0, 0};
var d = BitConverter.ToDouble(doubleBytes, 0);
不足的位数需要补足。
转成字节数组
从String
var s = "lou";
var strBytes = Encoding.ASCII.GetBytes(s);//指定编码方式。
//拿到[108,111,117] 也就是每个字母的acsii值。
从int,long,float,double转
int a = int.MaxValue;
var intBytes = BitConverter.GetBytes(a);
//4个字节 [255,255,255,127]
long b = long.MaxValue;
var longBytes = BitConverter.GetBytes(b);
//8个字节 [255,255,255,255,255,255,255,127]
float c = float.MaxValue;
var floatBytes = BitConverter.GetBytes(c);
//4个字节 [255,255,127,127]
double d = Double.MaxValue;
var doubleBytes = BitConverter.GetBytes(d);
//8个字节 [255,255,255,255,255,255,239,127]
每种类型对应的byte数
进制转换表示
Convert.ToByte(val)
把2,8,10,16进制的字符串转成Byte,也就是看他具体表示多少。
var b1 = Convert.ToByte("11",2);//把用2进制表示的11转成字节
Convert.ToString(value,toBase)
把一个byte用2,8,10,16进制表示
var a = Convert.ToString(8,2);//1000
这个可以转byte,不过实际只是一个类型转换。类似强转。float这种有四舍五入。