读取二进制问题,字节数组到结构体转换
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类型,但是程序出现了错误
如果大家有其他字节数组到结构体转换的办法,请分享与我,不胜感激!
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类型,但是程序出现了错误
如果大家有其他字节数组到结构体转换的办法,请分享与我,不胜感激!
...全文
相关推荐
C#读取二进制文件方法分析
主要介绍了C#读取二进制文件方法,较为详细的分析了C#读取二进制文件的原理与注意事项,具有一定参考借鉴价值,需要的朋友可以参考下
将BIN文件数据转换成TXT文件数据
将BIN文件数据转换成TXT文件数据,方便进一步的操作。
详解C++编程中对二进制文件的读写操作
主要介绍了C++编程中对二进制文件的读写操作,是C++入门学习中的基础知识,需要的朋友可以参考下
图片批量转换为C语言数组
经常需要使用emWin的GUI Builder工具把图片转换为C语言数组,但这个工具每次只能添加一个图片文件,无法批量处理。就用Python写了一个批量转换的小工具。
易语言指针到字节集应用源码.7z
易语言指针到字节集应用源码.7z



