C# 解析C结构体数据文件dat

c语言结构体数据格式

typedef struct 448
{
char STATUS_DATA[9]; // 日期 9
char STATUS_TIME[7]; // 时间 7
int SEL_PATT; // 体扫表 4
int LOCALFLG; // 控制方式 4
float ANT_PEAK_PWR; // 天线峰值功率 4
float XMTR_PEAK_PWR; // 发射机峰值功率 4
float ANT_AVG_PWR; // 天线平均功率 4
float XMTR_AVG_PWR; // 发射机平均功率 4
float POWER_METER_RATIO_DB; // 天线/发射机功率比 4
float ANT_PWR_MTR_ZERO; // 天线功率计调零 4
float XMTR_PWR_MTR_ZERO; // 发射机功率调零 4
int TX_RECYCLE_CNT; // 发射机重复循环次数 4
short spare1[2]; 2
float RNSPLN; //窄脉冲噪声电平 4
float RNSPLG; 4
float RNLPLN; //宽脉冲噪声电平 4
float RNLPLG; 4
float TE; //噪声温度 4
short IDU_TEST_DETECTIONS; //干扰检测数 2
short spare2; 2
float AGC_STEP_AMPL[6]; //AGC幅度 24
float AGC_STEP_PHASE[6]; //AGC相位 24
float AGC_IQ_AMPL_BAL; //AGC IQ幅度平衡 4
float AGC_IQ_PHASE_BAL; //AGC IQ相位平衡 4
short spare3[20]; 40
float EXPECTED_REFL_AMP[8]; //反射率期望值 32
float MEASURED_REFL_AMP[8]; //反射率测量值 32
float SYSSPLN; //窄脉冲标定常数 4
float SYSSPLG; 4
float SYSLPLN; //宽脉冲标定常数 4
float SYSLPLG; 4
float EXPECTED_VELOCITY[4]; //速度期望值 16
float MEASURED_VELOCITY[4]; //速度测量值 16
float EXPECTED_WIDTH[4]; //谱宽期望值 16
float MEASURED_WIDTH[4]; //谱宽测量值 16
short spare4[18]; 36
float EXPECTED_RF8_AMP[6]; 24
float MEASURED_RF8_AMP[6]; 24
short spare5[16]; 32
float UNFILTERED_LIN_CHAN_PWR;//滤波前功率 4
float FILTERED_LIN_CHAN_PWR; //滤波后功率 4
}RADAR_STATUS_DATA;

 

    /// 
    /// 读取.dat文件
    /// 
    public static RadarStatus ReadStatusFile()
    {
        try
        {
            List fileInfos = GetAllFiles(".dat", statusFolderPath);
            FileInfo file = fileInfos.Where(g =>        g.CreationTime.ToShortDateString().CompareTo(DateTime.Now.ToShortDateString()) == 0).OrderByDescending(p => p.LastWriteTime).Take(1).FirstOrDefault();
            if (file != null && File.Exists(file.FullName))
            {
                FileStream fs = new FileStream(file.FullName, FileMode.Open, FileAccess.Read);
                int size = Marshal.SizeOf(typeof(RadarStatus));
                byte[] buffer = new byte[size];
                fs.Read(buffer, 0, size);
                RadarStatus radar = (RadarStatus)RawDes(buffer, typeof(RadarStatus));
                return radar;
            }
            else
                return new RadarStatus();
        }
        catch (Exception ex)
        {
            Logger.WriteLog("读取RADAR_STATUS_DATA 失败  " + ex.Message + ex.StackTrace);
            throw ex;
        }
    }




 //解析数据
    private static object RawDes(byte[] rawdatas, Type anytype)
    {
        int rawsize = Marshal.SizeOf(anytype);
        if (rawsize > rawdatas.Length)
            return null;
        IntPtr buffer = Marshal.AllocHGlobal(rawsize);
        Marshal.Copy(rawdatas, 0, buffer, rawsize);
        object retobj = Marshal.PtrToStructure(buffer, anytype);
        Marshal.FreeHGlobal(buffer);
        return retobj;
    }

/// 
/// 状态信息结构体,与c数据结构对应,重要!!!
/// 
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct RadarStatus
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]
    public string STATUS_DATA; //[9] 日期 9
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 7)]
    public string STATUS_TIME; // [7]时间 7
    public int SEL_PATT; // 体扫表 4
    public int LOCALFLG; // 控制方式 4
    public float ANT_PEAK_PWR; // 天线峰值功率 4
    public float XMTR_PEAK_PWR; // 发射机峰值功率 4
    public float ANT_AVG_PWR; // 天线平均功率 4
    public float XMTR_AVG_PWR; // 发射机平均功率 4
    public float POWER_METER_RATIO_DB; // 天线/发射机功率比 4
    public float ANT_PWR_MTR_ZERO; // 天线功率计调零 4
    public float XMTR_PWR_MTR_ZERO; // 发射机功率调零 4
    public int TX_RECYCLE_CNT; // 发射机重复循环次数 4
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
    public short[] spare1; //[2] 2
    public float RNSPLN; //窄脉冲噪声电平 4
    public float RNSPLG;// 4
    public float RNLPLN; //宽脉冲噪声电平 4
    public float RNLPLG;// 4
    public float TE; //噪声温度 4
    public short IDU_TEST_DETECTIONS; //干扰检测数 2
    public short spare2; //2
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public float[] AGC_STEP_AMPL; // [6] AGC幅度 24
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public float[] AGC_STEP_PHASE; //[6] AGC相位 24
    public float AGC_IQ_AMPL_BAL; //AGC IQ幅度平衡 4
    public float AGC_IQ_PHASE_BAL; //AGC IQ相位平衡 4
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
    public short[] spare3;//[20] 40
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public float[] EXPECTED_REFL_AMP; //[8] 反射率期望值 32
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public float[] MEASURED_REFL_AMP; //[8] 反射率测量值 32
    public float SYSSPLN; //窄脉冲标定常数 4
    public float SYSSPLG; //4
    public float SYSLPLN; //宽脉冲标定常数 4
    public float SYSLPLG; //4
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public float[] EXPECTED_VELOCITY; //[4] 速度期望值 16
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public float[] MEASURED_VELOCITY; //[4] 速度测量值 16
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public float[] EXPECTED_WIDTH; //[4] 谱宽期望值 16
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public float[] MEASURED_WIDTH; //[4] 谱宽测量值 16
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 18)]
    public short[] spare4;//[18] 36
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public float[] EXPECTED_RF8_AMP;//[6] 24
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public float[] MEASURED_RF8_AMP;//[6] 24
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
    public short[] spare5;//[16] 32
    public float UNFILTERED_LIN_CHAN_PWR;//滤波前功率 4
    public float FILTERED_LIN_CHAN_PWR; //滤波后功率 4
}

 

你可能感兴趣的:(C结构体)