【问题标题】:Best way to represent Bit Arrays in C#?在 C# 中表示位数组的最佳方法?
【发布时间】:2011-02-09 18:57:54
【问题描述】:

我目前正在 c# 中构建一个 DHCPMessage 类。

RFC 可在此处获得:http://www.faqs.org/rfcs/rfc2131.html

public object DHCPMessage
{
    bool[8] op;
    bool[8] htype;
    bool[8] hlen;
    bool[8] hops;
    bool[32] xid;
    bool[16] secs;
    bool[16] flags;
    bool[32] ciaddr;
    bool[32] yiaddr;
    bool[32] siaddr;
    bool[32] giaddr;
    bool[128] chaddr;
    bool[512] sname;
    bool[1024] file;
    bool[] options;
}

如果我们想象每个字段都是一个固定长度的位数组,那么是什么:

  1. 最通用的
  2. 最佳实践

将其表示为一个类的方式???

或者..你会怎么写这个? :)

【问题讨论】:

  • 考虑查看 Bouncy Castle Crypto 的 C# 源代码。他们实现了许多处理比特级概念的 RFC 标准。
  • 相对于字节、无符号整数等?

标签: c# syntax construction


【解决方案1】:

你在这个错误的轨道上,它不是一个位向量。消息以“字节”定义,也就是众所周知的“字节”。可以与 Marshal.PtrToStructure 一起使用的等效 C# 声明是:

    [StructLayout(LayoutKind.Sequential, Pack=1, CharSet=CharSet.Ansi)]
    struct DHCPMessage {
        public byte op;
        public byte htype;
        public byte hlen;
        public byte hops;
        public uint xid;
        public ushort secs;
        public ushort flags;
        public uint ciaddr;
        public uint yiaddr;
        public uint siaddr;
        public uint giaddr;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst=16)]
        public byte[] chaddr;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=64)]
        public string sname;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)]
        public string file;
    }

您需要单独处理可变长度选项字段。

【讨论】:

  • 这可能是“正确”的答案。我不知道他为什么要将这些字段表示为位数组,但认为一定有充分的理由。如果消息实际上应该在某处发送,那么位数组只会创建不必要的工作。
【解决方案2】:

您确定要对其中一些使用位数组吗?例如,您可以将 byte 用于 8 位,将 int 用于 32 位,并将字节数组用于映射到 null 终止的字符串(例如“sname”)的片段。然后您可以使用简单的位运算符(&、|)来检查/操作位。

这里有一些关于将 TCP 标头转换为结构的帖子,其中还包括字节序等。

http://taylorza.blogspot.com/2010/04/archive-structure-from-binary-data.html http://taylorza.blogspot.com/2010/04/archive-binary-data-from-structure.html

这些已经很老了,我从我的旧博客中迁移了它们,以免它们丢失。

【讨论】:

  • 我同意 - 像在 OP 中那样做会非常困难,因为含义是作为一个整体的字段,而不是该字段中的单个位。
【解决方案3】:

对于初学者,您可以尝试 BitArray 类。无需在这里重新发明轮子。

如果您担心它会占用太多空间/内存,请不要担心。只需将其初始化为正确的大小:

BitArray op = new BitArray(8);

(上面将保存8位,应该占用1个字节)

【讨论】:

  • 确定不是有点腹胀?
猜你喜欢
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
相关资源
最近更新 更多