位字段在C#结构中表现不正常
最小:6位 res1:1位 iv:1位 结构中的所有内容看起来都很棒,但我没有得到预期的结果位字段在C#结构中表现不正常,c#,structure,C#,Structure,最小:6位 res1:1位 iv:1位 结构中的所有内容看起来都很棒,但我没有得到预期的结果 struct cp56time2a { internal byte cp56time2a_data1; public byte min { get { return (byte)(cp56time2a_data1 & 0x3f); } set { cp56time2a_data1 = (byte)((cp56time2a_d
struct cp56time2a
{
internal byte cp56time2a_data1;
public byte min
{
get { return (byte)(cp56time2a_data1 & 0x3f); }
set { cp56time2a_data1 = (byte)((cp56time2a_data1 & ~0x3f) | (value & 0x3f)); }
} //min :6; 0..59
public byte res1
{
get { return (byte)((cp56time2a_data1 >> 6) & 0x01); }
set { cp56time2a_data1 = (byte)((cp56time2a_data1 & ~(0x01 << 6)) | (value & 0x01) << 6); }
}
public byte iv
{
get { return (byte)((cp56time2a_data1 >> 7) & 0x01); }
set { cp56time2a_data1 = (byte)((cp56time2a_data1 & ~(0x01 << 7)) | (value & 0x01) << 7); }
}
}
预计将显示:min=21 | | res1=1 | | iv=0
但我得到的是:
结构的内部字节行为不正常。请说出你的想法 对于两个属性
res1
和iv
,您有:值&0x01
,换句话说,您只获取分配给这些属性的值的最低有效位
当您读取这些属性时,也会执行以下操作:
&0x01
。所以很明显,这些属性是用来读写一位的,也就是说,它们是0
或1
将res1
和iv
设为byte
而不是bool
有什么意义?只能表示1
或0
。将0x55
赋值给它们会产生误导。所有结果都是正确的。没有什么行为不端。你能解释一下为什么你认为他们错了吗?为什么您希望它在分配给res1之前显示res1=1?你从不给它赋值,所以它保持为零!当你给它赋值时(低位0x55),它会变为1。@Rotem我有很多字节要从缓冲区读取,我不想在函数内部做掩码和移位。此外,我有类似的结构,由几个1 | 2 | 3 | 4 | 5位序列组成:所以我没有使事情复杂化……你说得对。谢谢你,伙计。res1:'value&0x40'iv:'value&0x80'。这应该可以解决它。
T.min = 0x55 ;
Console.WriteLine("min = {0}", T.min);
Console.WriteLine("res1 = {0}", T.res1);
Console.WriteLine("iv = {0}", T.iv);
Console.WriteLine("cp56time2a_data1 = {0}",T.cp56time2a_data1);
T.res1 = 0x55 ;
Console.WriteLine("min = {0}", T.min);
Console.WriteLine("res1 = {0}", T.res1);
Console.WriteLine("iv = {0}", T.iv);
Console.WriteLine("cp56time2a_data1 = {0}", T.cp56time2a_data1);
T.iv = 0x55 ;
Console.WriteLine("min = {0}", T.min);
Console.WriteLine("res1 = {0}", T.res1);
Console.WriteLine("iv = {0}", T.iv);
Console.WriteLine("cp56time2a_data1 = {0}", T.cp56time2a_data1);`