我目前有一些粗略的谷歌代码..但有效,但我想换成枚举。
目前我需要一个字节来表示一些设置的位标志,
我目前有这个:
new byte[] {ConvertToByte(bitArray)})
用于行..
private static byte ConvertToByte(BitArray bits) // http://stackoverflow.com/questions/560123/convert-from-bitarray-to-byte
{
if (bits.Count != 8)
{
throw new ArgumentException("incorrect number of bits");
}
byte[] bytes = new byte[1];
bits.CopyTo(bytes, 0);
return bytes[0];
}
来自此网站的ConvertToByte ......
[Flags]
public enum EventMessageTypes
{
None = 0,
aaa = 1,
bbb = 2,
ccc = 4,
ddd = 8,
eee = 16,
fff = 32,
All = aaa | bbb | ccc | ddd | eee | fff // All Events
}
但是我想要在我触及时使用枚举,所以我创建了它:
// Do bitwise OR to combine the values we want
EventMessageTypes eventMessages = EventMessageTypes.aaa | EventMessageTypes.bbb | EventMessageTypes.ccc;
然后
{{1}}
但是我怎么把eventMessages变成一个字节(0x07)我想!所以我可以将它附加到我的字节数组中?
答案 0 :(得分:2)
只需将其转换为字节! 例如:
byte eventMessages =(byte)( EventMessageTypes.aaa | EventMessageTypes.bbb | EventMessageTypes.ccc);
答案 1 :(得分:2)
你有办法获得byte
,所以现在只是施放:
byte b = ConvertToByte(bitArray);
EventMessageTypes a = (EventMessageTypes) b;
此外,还有一个提示,将枚举范围限制为byte
,以防止有人稍后将范围值添加到枚举中:
[Flags]
public enum EventMessageTypes : byte
{
...
}
答案 2 :(得分:1)
如果我理解你的问题是正确的,那么实质上你可以像这样强制转换为枚举EventMessageTypes result = (EventMessageTypes)ConvertToByte(bitArray);
BitArray bitArray = new BitArray(new bool[]
{ true, true, false, false,
false, false, false, false });
EventMessageTypes b = (EventMessageTypes)ConvertToByte(bitArray);
您可以为了可读性而将来的代码重用成为扩展类
static class Extension
{
public static byte ToByte(this BitArray bits)
{
if (bits.Count != 8)
{
throw new ArgumentException("incorrect number of bits");
}
byte[] bytes = new byte[1];
bits.CopyTo(bytes, 0);
return bytes[0];
}
static class EnumConverter<TEnum> where TEnum : struct, IConvertible
{
public static readonly Func<long, TEnum> Convert = GenerateConverter();
static Func<long, TEnum> GenerateConverter()
{
var parameter = Expression.Parameter(typeof(long));
var dynamicMethod = Expression.Lambda<Func<long, TEnum>>(
Expression.Convert(parameter, typeof(TEnum)),
parameter);
return dynamicMethod.Compile();
}
}
public static T ToEnum<T>(this byte b) where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
{
throw new ArgumentException("T must be an enumerated type");
}
return EnumConverter<T>.Convert(b);
}
}
然后你可以像这样编写转换。 bitArray.ToByte()
甚至更好EventMessageTypes b = bitArray.ToByte().ToEnum<EventMessageTypes>();
答案 3 :(得分:1)
var bitArray = new BitArray(
new [] { true, true, false, false, false, false, false, false });
var eventMessages = (EventMessageTypes)bitArray
.Cast<Boolean>()
.Reverse()
.Aggregate(0, (agg, b) => (agg << 1) + (b ? 1 : 0));