【问题标题】:Convert decimal to binary combination (of custom lenght)将十进制转换为二进制组合(自定义长度)
【发布时间】:2019-02-17 22:40:15
【问题描述】:

我需要将几个十进制数字(或字符串或 1 和 0)转换为二进制组合。在 .NET 中,我看到许多使用 Byte 的库。字节是对 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 个第一位。我想要的结果是

 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

这怎么可能?

【问题讨论】:

  • 您是否尝试检索或设置过滤器和分区?
  • 我添加了我想要的示例
  • 所以您尝试将数据显示为十六进制、十进制、八进制或二进制格式的文本?
  • 截图来自 Windows Calculator 但我只对十六进制感兴趣

标签: c# bit-manipulation


【解决方案1】:

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

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

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

另一种方法是通过大小构造函数创建一个未初始化的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"));

【讨论】:

  • 我也不知道如何连接我的位变量
  • 这里是连接BitArrays的解决方案:stackoverflow.com/questions/518513/…
  • +1 @taffer。 Bastien,如果您正在处理 BitArray,那么如果您希望以十六进制显示结果,则需要决定如何处理不能被 16 整除的大小。
  • 连接有效,但我仍然无法正确转换为六进制。我用我使用的代码编辑了我的问题。结果和我的预期结果。
  • 看来字节序不是你所需要的。如果您在连接位以及转换后的字节之后插入Reverse,您将获得 3074。我创建了一个小提琴,请参见此处:dotnetfiddle.net/eALFeD - 编辑:如果您使用 Insert 到位置 0 而不是一个反向就足够了Append 创建十六进制结果时(小提琴已修改)。
【解决方案2】:

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

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

System.Convert.ToString(data, base);

其中 data 是您的 16 位值,base 可以是 2,8,10,16 表示二进制、八进制、十进制或十六进制。

【讨论】:

    猜你喜欢
    • 2014-05-01
    • 2012-06-26
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    相关资源
    最近更新 更多