之前一直使用UDP协议传输整形数据,直接使用byte数组传递就可以了。今天想传递double型的数据,在网上查了好久,发现需要解决的根本问题并不是如何通过UDP传输什么类型的数据,而是如何将double型无精度损失的存入byte数组中。
流程:
1、使用函数“BitConverter.GetBytes”将double型数据转为byte数组,BitConvert:将基础数据类型与字节数组相互转换。相关资料可查看:c# 使用BitConverter
2、将最终组成的待下发数组(byte类型)直接使用UDP传输。
网上关于如何通过UDP传输的代码示例很多,这里就不再描述。以下源码仅实现了double类型数据组帧和解析的过程:
private void button1_Click(object sender, EventArgs e)
{
byte[] dataByte = new byte[120];
int count = 0;
//将double型数据存入databyte中。
double data1 = 123.125;
byte[] buf = BitConverter.GetBytes((double)data1);
transport(ref dataByte, buf,ref count, 8);
data1 = 432.563;
buf = BitConverter.GetBytes((double)data1);
transport(ref dataByte, buf, ref count, 8);
data1 = 0xffffffff;
buf = BitConverter.GetBytes((uint)data1);
transport(ref dataByte, buf, ref count, 4);
//解析dataByte数据并显示
double b = tansitionToDouble(dataByte, 0, 8);
listBox1.Items.Add("b:" + b);
b = tansitionToDouble(dataByte, 8, 8);
listBox1.Items.Add("b1:" + b);
b = tansitionToUInt32(dataByte, 16, 4);
listBox1.Items.Add("b2:" + Convert.ToUInt32(b));
}
/// <summary>
/// 组帧
/// </summary>
/// <param name="dataByte"></param>
/// 目标数组
/// <param name="buf"></param>
/// 源数组
/// <param name="count"></param>
/// 起始下标
/// <param name="num"></param>
/// 传入字节总数
private void transport(ref byte[] dataByte, byte[] buf,ref int count,int num)
{
if(buf.Length < num)
return;
if (count + num > dataByte.Length)
return;
for (int i = 0; i < num; i++)
{
dataByte[count++] = buf[i];
}
}
/// <summary>
/// 将数组转为double
/// </summary>
/// <param name="databyte"></param>
/// 源数组
/// <param name="startIndex"></param>
/// 起始下标
/// <param name="num"></param>
/// 转换总字节数
/// <returns></returns>
private double tansitionToDouble(byte[] databyte,int startIndex,int num)
{
double data = -1;
if (databyte.Length < startIndex + num)
return data;
byte[] buf = new byte[num];
for (int i = 0; i < num; i++)
{
buf[i] = databyte[startIndex + i];
}
data = BitConverter.ToDouble(buf, 0);
return data;
}
/// <summary>
/// 将数组转为uint32
/// </summary>
/// <param name="databyte"></param>
/// 源数组
/// <param name="startIndex"></param>
/// 起始下标
/// <param name="num"></param>
/// 转换总字节数
/// <returns></returns>
private double tansitionToUInt32(byte[] databyte, int startIndex, int num)
{
UInt32 data = 0;
if (databyte.Length < startIndex + num)
return data;
byte[] buf = new byte[num];
for (int i = 0; i < num; i++)
{
buf[i] = databyte[startIndex + i];
}
data = BitConverter.ToUInt32(buf, 0);
return data;
}
运行结果如下图: