2014-03-01 30 views
1

我有这样的结构:C#改变字段的顺序在一个结构

public struct SERVER_DF_PARAMETERS 

    { 
     public bool bRunState;   
     public bool bWideband;   
     public double dFrequencyRF; 
     public double dFrequencyStartScan; 
     public double dFrequencyStopScan; 

     public double dBandwidthIF;  
     public double dBandwidthDF; 

     public bool bNormalModeDF;  
     public double dThresholdLevelDF; 
     public double dThresholdQualityDF; 
     public int iAverageTimeDF;  

     public bool bPreAmplifierRF; 
     public bool bLongAntennaRF; 
     public int iTunerModeRF; 
     public int iGainRF; 

     public bool bAutoGainIF;   
     public int iManualGainIF; 
     public int iAutoGainCtrlTime; 
     public double dMaxGainAgc;  
     public bool bAFC; 
     public bool bVoiceState;  //true -> On , false -> off 
     public bool bSquelchState;  //true -> On , false -> off 
     public bool bStateDenoising; //true -> On , false -> off 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)] 
     public String strDemodulation; //AM,FM,SSB,CW,... 
     public double dBandwidthVoice; //in KHz 
     public int iBeatFreqOffset; //in Hz (BFO) 
     public double dGainVoice;   //int dBm 

     public bool bClassifier;  //true -> Run , false -> Stop 
     public int iTimeHistoryCL;  //in millisecond 


    }; 

但是当程序运行字段的顺序改变这种(所有布尔值都在上面等):

(I added to watch to see its value) 


    bAFC false bool 
    bAutoGainIF false bool 
    bClassifier false bool 
    bLongAntennaRF false bool 
    bNormalModeDF true bool 
    bPreAmplifierRF false bool 
    bRunState true bool 
    bSquelchState false bool 
    bStateDenoising false bool 
    bVoiceState false bool 
    bWideband false bool 
    dBandwidthDF 20.0 double 
    dBandwidthIF 20.0 double 
    dBandwidthVoice 100.0 double 
    dFrequencyRF 100.0 double 
    dFrequencyStartScan 100.0 double 
    dFrequencyStopScan 200.0 double 
    dGainVoice 1.0 double 
    dMaxGainAgc -30.0 double 
    dThresholdLevelDF -130.0 double 
    dThresholdQualityDF 50.0 double 
    iAutoGainCtrlTime 1000 int 
    iAverageTimeDF 1000 int 
    iBeatFreqOffset 0 int 
    iGainRF 0 int 
    iManualGainIF 0 int 
    iTimeHistoryCL 1000 int 
    iTunerModeRF 0 int 
    strDemodulation "FM" string 

的问题是,当我想用​​插座,并发送这个结构的服务器和服务器在C++中并给出了这个结构的字节。所以领域的顺序不应该改变。

+3

你尝试过在你的结构的减速'[StructLayout(LayoutKind.Sequential)]'属性? – Zafar

+0

你确定内存中*字段的顺序正在改变吗?调试检查器只是在字段名称列出时进行字母排序。 –

+0

@Zafar:是的,我把它忘了,但是我忘记了(Pack = 1)。[StructLayout(LayoutKind.Sequential,Pack = 1)]效果很好 – Fateme

回答

2

[StructLayout(LayoutKind.Sequential, Pack=1)] 

public struct SERVER_DF_PARAMETERS 

强制编译器作为定义,这是它在默认情况下上市的结构顺序分配之前。如果你指定Pack = 1那么将组织结构以便每个字段在上的字节边界并且可以一次读取一个字节 - 即不需要打包。

参考Mastering C# structs,更多的解释^^

+0

我已经把[StructLayout(LayoutKind.Sequential)],但我忘记把(包= 1)。我的问题解决了。谢谢。 – Fateme

+0

解决的每个问题都会导致更多的理解,我也从问题中学习:-) –

0

您可以使用[StructureLayout]属性:

参考为here