C# 将十进制转换为二进制组合(自定义长度)

C# 将十进制转换为二进制组合(自定义长度),c#,bit-manipulation,C#,Bit Manipulation,我需要将几个十进制数(或字符串或1和0)转换为二进制组合。在.NET中,我看到许多库使用字节。一个字节是8位的操作。在我的例子中,我必须使用需要连接在一起的3位的集合 例如: 对于过滤器或分区,我有一个3位 我应该用什么来帮助我进行这种转换?现在我试图理解BitArray,但我不知道如何创建一个特定大小的位,然后轻松填充它们 这是我已经做过的 BitArray headerBits = new BitArray(new bool[] { false, false, true, true

我需要将几个十进制数(或字符串或1和0)转换为二进制组合。在.NET中,我看到许多库使用字节。一个字节是8位的操作。在我的例子中,我必须使用需要连接在一起的3位的集合

例如:

对于过滤器或分区,我有一个3位

我应该用什么来帮助我进行这种转换?现在我试图理解BitArray,但我不知道如何创建一个特定大小的位,然后轻松填充它们

这是我已经做过的

    BitArray headerBits = new BitArray(new bool[] { false, false, true, true, false, false, false, false }); // 8
    BitArray filterBits = new BitArray(new bool[] { false, true, true });  // 11
    BitArray PartitionBits = new BitArray(new bool[] { true, false, true });  // 14
    BitArray CompanyPrefixBits = new BitArray(new bool[] { false, false }); // 16
让我们试试这16个第一位。我想要的结果是

编辑------

BitArray headerBits=new BitArray(new bool[]{false,false,true,true,false,false});//8.
BitArray filterBits=新的BitArray(新的bool[]{false,true,true});//11
BitArray PartitionBits=新的BitArray(新的bool[]{true,false,true});//14
BitArray CompanyPrefixBits=新的BitArray(新的bool[]{false,false});//16
BitArray newBitArray=新的位数组(headerBits.Cast()
.Concat(filterBits.Cast())
.Concat(PartitionBits.Cast())
.Concat(CompanyPrefixBits.Cast())
.ToArray());
var byteArray=newBitArray.ToByteArray();
Console.WriteLine($“{BitConverter.ToString(byteArray,0)}”);
//结果是0C-2E
//我预计30-74岁
这怎么可能

我试图理解位数组,但我不知道如何创建一个特定大小的位,然后轻松填充它们

位数组
具有多个构造函数。最明显的是从
bool
数组创建
BitArray

var bits = new BitArray(new[] { true, false, true, true });
另一种方法是仅通过大小构造函数创建未初始化的
位数组
,然后逐个设置位:

var bits = new BitArray(4); // 4 bits, all false for now
for (int i = 0; i < bits.Length; i++)
    bits[i] = GetMyNextBit();
我只对十六进制感兴趣

您可以轻松地将字节转换为十六进制字符串:

var result = new StringBuilder(bytes.Length * 2);
for (int i = 0; i < bytes.Length; i++)
    result.Append(bytes[i].ToString("X2"));
var result=新的StringBuilder(bytes.Length*2);
for(int i=0;i
我看到您正在从RFID标签读取数据。 所有数据都可以被视为一系列字节,因此示例使用字节

如果数据以十六进制格式显示为字符串,那么我建议您将数据读入数组,然后使用

System.Convert.ToString(数据、数据库)


其中数据是16位的值,二进制、八进制、十进制或十六进制的基数可以是2、8、10、16。

您是否正在尝试检索或设置筛选器和分区?我添加了一个示例,说明了我想要的内容,以便您尝试以十六进制、十进制或,八进制还是二进制格式?屏幕截图来自Windows计算器,但我只对十六进制感兴趣。我也不知道如何连接我的位。Vraibleshere是连接
BitArray
s:+1@taffer的解决方案。Bastien,如果你在处理一个位数组,那么你需要决定如何处理一个不能被16整除的大小,如果你想用十六进制来显示结果的话。连接是有效的,但是我仍然不能正确地转换成十六进制。我用我使用的代码编辑了我的问题。结果和我的预期结果。看起来持久性不是你需要的。如果在串联位以及转换后的字节后插入
反向
,则得到3074。我创建了一个提琴,请参见此处:-编辑:如果在创建十六进制结果(修改了提琴)时使用
Insert
而不是
Append
将其插入位置0,则一个反转就足够了。
var bits = new BitArray(4); // 4 bits, all false for now
for (int i = 0; i < bits.Length; i++)
    bits[i] = GetMyNextBit();
public static byte[] ToByteArray(this BitArray bits)
{
    byte[] result = new byte[(bits.Length - 1) / 8 + 1];
    bits.CopyTo(result, 0);
    return result;
}
var result = new StringBuilder(bytes.Length * 2);
for (int i = 0; i < bytes.Length; i++)
    result.Append(bytes[i].ToString("X2"));