如何将枚举转换为字节数组
本文关键字:字节 字节数 数组 转换 枚举 | 更新日期: 2023-09-27 18:07:44
我有一个enum如下:
[Flags]
public enum AggregationLevel
{
/// <summary>
/// 00000001
/// </summary>
Department = 1,
/// <summary>
/// 00000010
/// </summary>
Gbu = 2,
/// <summary>
/// 00000100
/// </summary>
Division = 4,
/// <summary>
/// 00001000
/// </summary>
Region = 8,
/// <summary>
/// 00010000
/// </summary>
Market = 16,
/// <summary>
/// 00100000
/// </summary>
Cluster = 32,
/// <summary>
/// 01000000
/// </summary>
Store = 64
}
然后我有一个存储过程参数,它需要一个varbinary(字节数组)。
我有一个enum实例,应该传递给它:
AggregationLevel thisLevel = AggregationLevel.Department & AggregationLevel.Division;
然后,该值应该传递给这个存储过程:
var parameter = new SqlParameter("@pBitMask", SqlDbType.VarBinary)
parameter = ?
如何将我的"thisLevel"enum转换为字节数组,以便将其分配给此sql参数?
谢谢,
几件事…
1)你需要使用OR而不是AND:
AggregationLevel thisLevel = AggregrationLevel.Department | AggregationLevel.Division;
2)你可以使用这个序列,这样你就不必记住十进制中2的幂了:
0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100 ...
3)最后,varbinary
不是你想要的。看看integer
和bigint
。枚举被存储为int
s或long
s,并且您被限制在int
或long
中的位数。如果你想在varbinary
中存储,你需要将一个值序列化为一个字节串,这取决于你是否想要大端字节,应该使用多少字节来存储——也许它甚至是可变的,等等。需要更多信息
#3的两个选项:
。如果只有你的代码在你的控制之下,不要使用varbinary,使用int或bigint(取决于所需的位数)。如果要查询位字段
,更好的(可能)是使用位字段。B。如果不是,DBA或应用程序提供者将能够指定他们希望如何填充varbinary
希望对你有帮助。
在DB中使用int
并存储为int
值:
AggregationLevel thisLevel = AggregationLevel.Department | AggregationLevel.Division;
int val = (int)thisLevel;
AggregationLevel lvlUpd = (AggregationLevel)val;
您不需要将其存储为"字节数组",组合值可以轻松地存储在单个整数中。