【问题标题】:Converting Dword into Bit array in C#在 C# 中将 Dword 转换为位数组
【发布时间】:2017-11-16 07:05:32
【问题描述】:

我正在开发一个使用 LibnoDave 库连接到 Siemens PLC 的应用程序。我得到一个 Dword 值,我将其转换为 INT 值,但现在我需要将此 INT 值转换为 BIT 数组。例如,我将数字 62000 作为 INT 值,二进制为 1111001000110000。我需要那个价值。如何做到这一点?

【问题讨论】:

标签: c# bit dword


【解决方案1】:

如果您想用二进制表示uint,请尝试使用Convert 类:

  uint source = 62000;

  string result = Convert.ToString(source, 2);

  Console.WriteLine(result);

结果

  1111001000110000

如果你想要System.Collections.BitArray 实例:

  using System.Collections;
  using System.Linq; 

  ...

  uint source = 62000;

  BitArray array = new BitArray(BitConverter.IsLittleEndian 
    ? BitConverter.GetBytes(source)
    : BitConverter.GetBytes(source).Reverse().ToArray());

  // Test
  string result = string
    .Concat(array
       .OfType<bool>()
       .Reverse()
       .Select(item => item ? 1 : 0))
    .TrimStart('0');

  Console.WriteLine(result);

结果

  1111001000110000 

【讨论】:

  • Convert.ToString 是否总是将数字视为大端?旁注:TrimStart('0') 似乎是不必要的。例如,如果您使用uint source = 0 - 结果将是空字符串,而预期结果(我认为)是带有 16 个零的字符串。
  • @Evk:谢谢!我同意字节序检查;但由于result 只是演示了array 包含正确的数据(对于单个62000 测试)让我保持TrimStart 原样。
  • 但那是因为你使用了uint。由于 OP 说 62000 表示为 2 个字节 - 您必须使用 ushortINT 他使用的问题可能意味着任何事情,因为据我了解它不是 C# int。使用ushort,您可以删除TrimStart。您的字节序检查也有点奇怪,因为如果BitConverter 不是小字节序,您会反转一次,然后在使用 BitArray 时再次反转一次。因此,如果 BitConverter 是 little endian,则需要反转并在执行 Concat 时删除 Reverse()
  • 如果我理解的问题是正确的,它是关于 DWORD msdn.microsoft.com/en-us/library/cc230318.aspx "32-bit 无符号整数",这就是为什么我把 uint (@987654347 @)
  • 好吧,他将 DWORD 转换为某个 INT 值,而他需要将那个 INT 值转换为位数组(也许 INT 是 msdn.microsoft.com/en-us/library/cc230334.aspx 在这种情况下我们都错了)。无论如何,OP确实可以自己决定他的意思。
【解决方案2】:

问题是在那个 DWORD 中我只需要第二个单词。例如,如果我收到 11111111111111110000000000000000 ,我只需要这个 Dword 的 1111111111111111 。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多