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

问题描述 投票:1回答:2

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

例如:

enter image description here

对于过滤器或分区我有一个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个第一位。我想要的结果是

enter image description here

 3074

编辑------

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

BitArray newBitArray = new BitArray(headerBits.Cast<bool>()
.Concat(filterBits.Cast<bool>())
.Concat(PartitionBits.Cast<bool>())
.Concat(CompanyPrefixBits.Cast<bool>())
.ToArray());

var byteArray = newBitArray.ToByteArray();
Console.WriteLine($"{BitConverter.ToString(byteArray, 0)}");
// Result is 0C-2E
// I expect 30-74

这怎么可能?

c# bit-manipulation
2个回答
1
投票

我尝试理解BitArray,但我不明白如何创建特定大小的位,然后轻松填充它们。

BitArray有几个建设者。最明显的是从BitArray数组创建bool

var bits = new BitArray(new[] { true, false, true, true });

另一种方法是仅通过size构造函数创建一个未初始化的BitArray,然后逐个设置位:

var bits = new BitArray(4); // 4 bits, all false for now
for (int i = 0; i < bits.Length; i++)
    bits[i] = GetMyNextBit();

更新:

如果您的主要问题是将连接位转换为字节,那么最好使用一个大的BitArray用于所有字段。

设置完所有位后,可以使用此扩展方法:

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"));

0
投票

我看到你正在从RFID标签上读取数据。所有数据都可以视为一系列字节,因此示例使用字节。

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

System.Convert.ToString(data, base);

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

© www.soinside.com 2019 - 2024. All rights reserved.