读取二进制问题,字节数组到结构体转换
1、C#中四个字节的浮点数用什么表示,Int32是整形,有没有其他类型?
2、结构体声明如下:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
public struct RadarSite
{
#region 变量
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)]
public char[] country; //国家名,文本格式输入
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public char[] province; //省名,文本格式输入
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]
public char[] station; //站名,文本格式输入
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public char[] stationNumber; //区站号,文本格式输入
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public char[] radarType; //雷达型号,文本格式输入
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] longitude; //天线所在经纬度,文本格式输入
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] latitude; //天线所在纬度,文本格式输入
public Int32 longitudeValue; //天线所在经度的数值,以1/1000度为计数单位 //东经(E)为正,西经(W)为负
public Int32 latitudeValue; //天线所在纬度的数值,以1/1000度为计数单位 //北纬(N)为正,南纬(S)为负
public Int32 height; ////天线海拔高度,以毫米为计数单位
public short maxAngle; //测站周围地物最大遮挡仰角,以1/100度为计数单位
public short optiAngle; //测站的最佳观测仰角(地物回波强度<10dBZ),以1/100度为计数单位
public short mangFreq; // 雷达工作频点(可由此值计算波长)
#endregion
public RadarSite(int ctr, int pro, int sta, int staN, int rat, int lon, int lat)
{
country = new char[ctr];
province = new char[pro];
station = new char[sta];
stationNumber = new char[staN];
radarType = new char[rat ];
longitude = new char[lon];
latitude = new char[lat ];
longitudeValue = 0;
latitudeValue = 0;
height = 0;
maxAngle = 0;
optiAngle = 0;
mangFreq = 0;
}
}
其中,RadarSite(int ctr, int pro, int sta, int staN, int rat, int lon, int lat)为结构体初始化函数,因为不初始化的话,结构体无法使用,如果有其他解决办法,请各位不吝赐教!
另外,[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]中的CharSet = CharSet.Auto这个是什么意思,CharSet有多个选项,请说明白简单一点,VS提供的解释过于专业,我没看懂
3、在结构体确定之后,利用binaryreader先读取RadarSite大小的一段,放到字节数组中,现在的问题是如何把读出来的数据转换到结构体中?
参考了网上的字节数组到结构体的转换方法如下:
#region byte数组转为目标结构体
public static object BytesToStuct(byte[] bytes, Type type)
{
//得到结构体的大小
int size = Marshal.SizeOf(type);
//byte数组长度小于结构体的大小
if (size > bytes.Length)
{
//返回空
return null;
}
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将byte数组拷到分配好的内存空间
Marshal.Copy(bytes, 0, structPtr, size);
//将内存空间转换为目标结构体
object obj = Marshal.PtrToStructure(structPtr, type);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回结构体
return obj;
}
#endregion
但是遇到两个问题:
public static object BytesToStuct(byte[] bytes, Type type)
1、object 是什么类型?针对我的这个程序,是否就是RadarSite结构体类型?
2、Type又是什么类型?我理解这个也应该是RadarSite类型,但是程序出现了错误
如果大家有其他字节数组到结构体转换的办法,请分享与我,不胜感激!