【发布时间】:2017-11-16 07:05:32
【问题描述】:
我正在开发一个使用 LibnoDave 库连接到 Siemens PLC 的应用程序。我得到一个 Dword 值,我将其转换为 INT 值,但现在我需要将此 INT 值转换为 BIT 数组。例如,我将数字 62000 作为 INT 值,二进制为 1111001000110000。我需要那个价值。如何做到这一点?
【问题讨论】:
我正在开发一个使用 LibnoDave 库连接到 Siemens PLC 的应用程序。我得到一个 Dword 值,我将其转换为 INT 值,但现在我需要将此 INT 值转换为 BIT 数组。例如,我将数字 62000 作为 INT 值,二进制为 1111001000110000。我需要那个价值。如何做到这一点?
【问题讨论】:
如果您想用二进制表示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 个零的字符串。
result 只是演示了array 包含正确的数据(对于单个62000 测试)让我保持TrimStart 原样。
uint。由于 OP 说 62000 表示为 2 个字节 - 您必须使用 ushort。 INT 他使用的问题可能意味着任何事情,因为据我了解它不是 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 中我只需要第二个单词。例如,如果我收到 11111111111111110000000000000000 ,我只需要这个 Dword 的 1111111111111111 。
【讨论】: