从位数组更改为枚举
Change from bitarray to enum
我目前有一些粗略的 google 代码..可以工作,但我想换成一个枚举。
目前我需要一个字节来表示一些设置的位标志,
我目前有这个:
BitArray bitArray =new BitArray(new bool[] { true, true, false, false, false, false, false, false });
在线使用..
new byte[] {ConvertToByte(bitArray)})
使用此站点的 ConvertToByte...
private static byte ConvertToByte(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];
}
但是我想使用枚举,所以我创建了它:
[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;
但是我想如何才能将 eventMessages 设置为一个字节 (0x07)!这样我就可以将它附加到我的字节数组中了吗?
如果我对你的问题理解正确,那么本质上你可以像这样转换为枚举 EventMessageTypes result = (EventMessageTypes)ConvertToByte(bitArray);
BitArray bitArray = new BitArray(new bool[]
{ true, true, false, false,
false, false, false, false });
EventMessageTypes b = (EventMessageTypes)ConvertToByte(bitArray);
为了可读性和将来的代码重用,您可以进行扩展 class
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);
}
}
然后你可以这样写convert。 bitArray.ToByte()
甚至更好 EventMessageTypes b = bitArray.ToByte().ToEnum<EventMessageTypes>();
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));
只需将其转换为字节即可!
示例:
byte eventMessages =(byte)( EventMessageTypes.aaa | EventMessageTypes.bbb | EventMessageTypes.ccc);
你有办法获得 byte
,所以现在只需施放:
byte b = ConvertToByte(bitArray);
EventMessageTypes a = (EventMessageTypes) b;
此外,提示,将枚举范围限制为 byte
以防止有人稍后将超出范围的值添加到枚举中:
[Flags]
public enum EventMessageTypes : byte
{
...
}
我目前有一些粗略的 google 代码..可以工作,但我想换成一个枚举。
目前我需要一个字节来表示一些设置的位标志,
我目前有这个:
BitArray bitArray =new BitArray(new bool[] { true, true, false, false, false, false, false, false });
在线使用..
new byte[] {ConvertToByte(bitArray)})
使用此站点的 ConvertToByte...
private static byte ConvertToByte(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];
}
但是我想使用枚举,所以我创建了它:
[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;
但是我想如何才能将 eventMessages 设置为一个字节 (0x07)!这样我就可以将它附加到我的字节数组中了吗?
如果我对你的问题理解正确,那么本质上你可以像这样转换为枚举 EventMessageTypes result = (EventMessageTypes)ConvertToByte(bitArray);
BitArray bitArray = new BitArray(new bool[]
{ true, true, false, false,
false, false, false, false });
EventMessageTypes b = (EventMessageTypes)ConvertToByte(bitArray);
为了可读性和将来的代码重用,您可以进行扩展 class
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);
}
}
然后你可以这样写convert。 bitArray.ToByte()
甚至更好 EventMessageTypes b = bitArray.ToByte().ToEnum<EventMessageTypes>();
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));
只需将其转换为字节即可!
示例:
byte eventMessages =(byte)( EventMessageTypes.aaa | EventMessageTypes.bbb | EventMessageTypes.ccc);
你有办法获得 byte
,所以现在只需施放:
byte b = ConvertToByte(bitArray);
EventMessageTypes a = (EventMessageTypes) b;
此外,提示,将枚举范围限制为 byte
以防止有人稍后将超出范围的值添加到枚举中:
[Flags]
public enum EventMessageTypes : byte
{
...
}