现在需要从一个二进制文件中读取特定的数组,该二进制文件由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);
即便没有定死也能解析出长度
所以你就一个长度一个长度的读取然后组合
例如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++那样用指针对内存和结构操作了
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长度字节流);
int x = Convert.ToIn32(4长度字节流);
#8
用FileStream从你那个文件中一段一段(每段长2432Bytes)读出数据,放到一个byte[]中,然后取得这个byte[]的首地址指针(用fixed方式),再把这个指针强制转换成一个Rount指针,这时就可以访问其字段了。
#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);
即便没有定死也能解析出长度
所以你就一个长度一个长度的读取然后组合
例如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++那样用指针对内存和结构操作了
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长度字节流);
int x = Convert.ToIn32(4长度字节流);
#8
用FileStream从你那个文件中一段一段(每段长2432Bytes)读出数据,放到一个byte[]中,然后取得这个byte[]的首地址指针(用fixed方式),再把这个指针强制转换成一个Rount指针,这时就可以访问其字段了。
#9
能否写出每一步的关键函数?谢谢了