c# 从二进制文件中读取结构体

时间:2023-01-04 10:12:41
各位,请教了,情况是这样的:
现在需要从一个二进制文件中读取特定的数组,该二进制文件由10个大小为2432Bytes的结构体组成.每个结构体大致如下:
 struct Rount
{
    unsigned short int CTM[6]; 
    unsigned short int MessageSize;  
    char ChannelID;    
    char MessageType;  
    short int IDSequence;  
    unsigned short int ;
 
    unsigned char dBZ[460];
    unsigned char Vel[920];
    unsigned char SW[920];

}

用FileStream的方式一次读取2432Bytes好像只能放到byte数组中,问题就是我怎样才能把读出来的2432Bytes的数据放到结构体中,这样变量就可以对应起来,用Rount.dBZ的方式访问里面的数组,谢谢回复

9 个解决方案

#1


你要自己写代码把数据填充到结构体中!

#2


这样的结构体一般都是每个参数长度都是定死的
即便没有定死也能解析出长度
所以你就一个长度一个长度的读取然后组合
例如short 类型占16位长度
于是可以这样得到第一个short类型的数
byte[] socureb = new byte[2432] { 0x21,0x22,0x32,0x33………………};
byte[] tempb = new byte[16];
Array.Copy(socureb, 0, tempb, 0, 16);
Rount.CTM=BitConverter.ToInt16(tempb,0);

#3


一个int 4字节 一个char(c#)里1字节,short 2字节 慢慢读

#4


这和把xml文件按类的方式读取没区别

#5


C#中结构这样定义:
public unsafe struct Rount
        {
            public fixed ushort CTM[6];
            public ushort MessageSize;
            public byte ChannelID;
            public byte MessageType;
            public short IDSequence;
            public ushort XXXX;
            public fixed byte dBZ[460];
            public fixed byte Vel[920];
            public fixed byte SW[920];
        }

然后你就可以用类似于C/C++那样用指针对内存和结构操作了

#6


另外,soaringbird() :能稍微再详细的讲讲吗?

#7


比如第一个值类型占据n个字节,把这n个字节提取出来,使用Convert中的类型转换就可以了.

int x = Convert.ToIn32(4长度字节流);

#8


用FileStream从你那个文件中一段一段(每段长2432Bytes)读出数据,放到一个byte[]中,然后取得这个byte[]的首地址指针(用fixed方式),再把这个指针强制转换成一个Rount指针,这时就可以访问其字段了。

#9


引用 8 楼 soaringbird 的回复:
用FileStream从你那个文件中一段一段(每段长2432Bytes)读出数据,放到一个byte[]中,然后取得这个byte[]的首地址指针(用fixed方式),再把这个指针强制转换成一个Rount指针,这时就可以访问其字段了。


能否写出每一步的关键函数?谢谢了

#1


你要自己写代码把数据填充到结构体中!

#2


这样的结构体一般都是每个参数长度都是定死的
即便没有定死也能解析出长度
所以你就一个长度一个长度的读取然后组合
例如short 类型占16位长度
于是可以这样得到第一个short类型的数
byte[] socureb = new byte[2432] { 0x21,0x22,0x32,0x33………………};
byte[] tempb = new byte[16];
Array.Copy(socureb, 0, tempb, 0, 16);
Rount.CTM=BitConverter.ToInt16(tempb,0);

#3


一个int 4字节 一个char(c#)里1字节,short 2字节 慢慢读

#4


这和把xml文件按类的方式读取没区别

#5


C#中结构这样定义:
public unsafe struct Rount
        {
            public fixed ushort CTM[6];
            public ushort MessageSize;
            public byte ChannelID;
            public byte MessageType;
            public short IDSequence;
            public ushort XXXX;
            public fixed byte dBZ[460];
            public fixed byte Vel[920];
            public fixed byte SW[920];
        }

然后你就可以用类似于C/C++那样用指针对内存和结构操作了

#6


另外,soaringbird() :能稍微再详细的讲讲吗?

#7


比如第一个值类型占据n个字节,把这n个字节提取出来,使用Convert中的类型转换就可以了.

int x = Convert.ToIn32(4长度字节流);

#8


用FileStream从你那个文件中一段一段(每段长2432Bytes)读出数据,放到一个byte[]中,然后取得这个byte[]的首地址指针(用fixed方式),再把这个指针强制转换成一个Rount指针,这时就可以访问其字段了。

#9


引用 8 楼 soaringbird 的回复:
用FileStream从你那个文件中一段一段(每段长2432Bytes)读出数据,放到一个byte[]中,然后取得这个byte[]的首地址指针(用fixed方式),再把这个指针强制转换成一个Rount指针,这时就可以访问其字段了。


能否写出每一步的关键函数?谢谢了