使用C#中的位字段进行编组
是否可以将包含位字段的C风格结构编组到C#结构中,或者您是否必须将其编组为基本类型然后执行位掩码?
例如,我想从这样的C风格结构编组:
struct rgb16 { unsigned int R : 4; unsigned int G : 5; unsigned int B : 4; }
并将其编组为以下内容:
[StructLayout(LayoutKind.Sequential)] public struct Rgb16 { public byte R; public byte G; public byte B; }
C#中没有位字段。 因此,我将使用封装了小提琴的属性:
[StructLayout(LayoutKind.Sequential)] public struct Rgb16 { private readonly UInt16 raw; public byte R{get{return (byte)((raw>>0)&0x1F);}} public byte G{get{return (byte)((raw>>5)&0x3F);}} public byte B{get{return (byte)((raw>>11)&0x1F);}} public Rgb16(byte r, byte g, byte b) { Contract.Requires(r<0x20); Contract.Requires(g<0x40); Contract.Requires(b<0x20); raw=r|g<<5|b<<11; } }
我避免添加setter,因为我喜欢不可变的结构,但原则上你也可以添加它们。
这是我的rgb16结构的“安全c#”端口。
[StructLayout(LayoutKind.Explicit, Size = 2, Pack = 1)] public class Color16 { // Btifield: 5 [FieldOffset(0)] private ushort b_i; public ushort b { get { return (ushort)((b_i >> 11) & 0x1F); } set { b_i = (ushort)((b_i & ~(0x1F << 11)) | (value & 0x3F) << 11); } } // Bitfield: 6 [FieldOffset(0)] private ushort g_i; public ushort g { get { return (ushort)((g_i >> 5) & 0x7F); } set { g_i = (ushort)((g_i & ~(0x7F << 5)) | (value & 0x7F) << 5); } } // Bitfield: 5 [FieldOffset(0)] private ushort r_i; public ushort r { get { return (ushort) (r_i & 0x1F); } set { r_i = (ushort) ((r_i & ~0x1F) | (value & 0x1F)); } } [FieldOffset(0)] public ushort u; public Color16() { } public Color16(Color16 c) { u = cu; } public Color16(ushort U) { u = U; } }
我已经编组了像以下一样的位域:
public struct Rgb16 { public ushort Value; // two byte value that internally contain structure R(4):G(5):B(4) public Rgb16BitField GetBitField { get; set; } }
其中属性通过将Value划分为位来创建新结构。
不是最好的方法,但没有找到任何其他适合我的方法。 如果你愿意,我可以提供GetBitField的代码(它不是很紧凑)
更新: Tony在您的问题的评论中提供的链接使用相同的想法,但似乎比我的更准确,所以如果你找不到更好的话,请使用他的解决方案
上述就是C#学习教程:使用C#中的位字段进行编组分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/998985.html