读取二进制问题,字节数组到结构体转换

winbq5 2010-11-02 07:54:49
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类型,但是程序出现了错误

如果大家有其他字节数组到结构体转换的办法,请分享与我,不胜感激!
...全文
418 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
winbq5 2010-12-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qqamoon 的回复:]
MSDN 对于 CharSet 有说明:
128 个元素的 char 数组的大小为 256 字节。在固定大小的 char 缓冲区中,每个字符始终占用两个字节,而与编码无关。即使将 char 缓冲区封送到具有 CharSet = CharSet.Auto 或 CharSet = CharSet.Ansi 的 API 方法或结构,也是如此。


C# code

// 单精度浮点型 siz……
[/Quote]

那如何解释6楼我那个回复呢?
龍过鸡年 2010-12-09
  • 打赏
  • 举报
回复
MSDN 对于 CharSet 有说明:
128 个元素的 char 数组的大小为 256 字节。在固定大小的 char 缓冲区中,每个字符始终占用两个字节,而与编码无关。即使将 char 缓冲区封送到具有 CharSet = CharSet.Auto 或 CharSet = CharSet.Ansi 的 API 方法或结构,也是如此。


// 单精度浮点型 sizeof(float) = 4

// 你需要的 Marshal.SizeOf(typeof(RadarSite)) 是多少?
// 我这个输出是 48
// 你试试看 不知道能不能用

[StructLayout(LayoutKind.Sequential)]
public struct RadarSite
{
[MarshalAs(UnmanagedType.LPStr, SizeConst = 30)]
public string country;

[MarshalAs(UnmanagedType.LPStr, SizeConst = 20)]
public string province;

[MarshalAs(UnmanagedType.LPStr, SizeConst = 40)]
public string station;

[MarshalAs(UnmanagedType.LPStr, SizeConst = 10)]
public string stationNumber;

[MarshalAs(UnmanagedType.LPStr, SizeConst = 20)]
public string radarType;

[MarshalAs(UnmanagedType.LPStr, SizeConst = 16)]
public string longitude;

[MarshalAs(UnmanagedType.LPStr, SizeConst = 16)]
public string latitude;

public float longitudeValue;
public float latitudeValue;
public float height;
public short maxAngle;
public short optiAngle;
public short mangFreq;
}


winner2050 2010-12-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fdh120 的回复:]
还有雷达,你搞军工吗
[/Quote]

气象、警用、船用的雷达多了。
winbq5 2010-11-03
  • 打赏
  • 举报
回复
呵呵,雷达的应用范围很广
不懂装懂 2010-11-03
  • 打赏
  • 举报
回复
还有雷达,你搞军工吗
winbq5 2010-11-03
  • 打赏
  • 举报
回复
,[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]中的CharSet = CharSet.Auto

经实验,CharSet的各变量对char以及char[]的影响如下:
ANSI:char以及char[]占一个字节
AUTO:char以及char[]占两个字节
UNICODE:char以及char[]占两个字节
winbq5 2010-11-03
  • 打赏
  • 举报
回复
顶一下~~

高手来解答下啊
YellowManDog 2010-11-03
  • 打赏
  • 举报
回复
顶吧,等待高手的出现
熙风 2010-11-03
  • 打赏
  • 举报
回复
顶吧,等待高手的出现············
deyygywxf 2010-11-03
  • 打赏
  • 举报
回复
顶吧,等待高手的出现············
GoAwayZ 2010-11-02
  • 打赏
  • 举报
回复
不要沉了
tea1111980 2010-11-02
  • 打赏
  • 举报
回复
顶了!

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧