如何将枚举转换为字节数组

本文关键字:字节 字节数 数组 转换 枚举 | 更新日期: 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不是你想要的。看看integerbigint。枚举被存储为int s或long s,并且您被限制在intlong中的位数。如果你想在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;

您不需要将其存储为"字节数组",组合值可以轻松地存储在单个整数中。