C# C语言中Dword到位数组的转换#

C# C语言中Dword到位数组的转换#,c#,bit,dword,C#,Bit,Dword,我在一个应用程序中工作,该应用程序使用LibnoDave库连接到西门子PLC。我得到一个Dword值,我把它转换成一个INT值,但现在我需要把这个INT值转换成一个位数组。例如,我得到一个INT值,即二进制中的62000‭1111001000110000‬. 我需要那个值。如何做到这一点?如果要用二进制表示uint,请尝试使用Convert类: uint source = 62000; string result = Convert.ToString(source, 2); Co

我在一个应用程序中工作,该应用程序使用LibnoDave库连接到西门子PLC。我得到一个Dword值,我把它转换成一个INT值,但现在我需要把这个INT值转换成一个位数组。例如,我得到一个INT值,即二进制中的62000‭1111001000110000‬. 我需要那个值。如何做到这一点?

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

  uint source = 62000;

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

  Console.WriteLine(result);
结果

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

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

  uint source = 62000;

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

  Console.WriteLine(result);
结果

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

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

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

Is
Convert.ToString
的可能重复是否始终将数字视为大端?旁注:
TrimStart('0')
似乎没有必要。例如,如果您使用
uint source=0
-结果将是空字符串,而预期结果(我认为)是带16个零的字符串。@Evk:谢谢!我同意Endian检查;但是由于
结果
仅显示
数组
包含正确的数据(对于单个
62000
测试),所以让我保持
TrimStart
原样。但这是因为您使用了
uint
。因为OP说62000表示为2个字节,所以必须使用
ushort
<他所用的code>INT可以表示任何东西,因为据我所知,它不是C#INT。使用
ushort
可以删除
TrimStart
。endian检查也有点奇怪,因为如果
BitConverter
不是小endian,则反转一次,然后在使用BitArray时再次反转。因此,如果位转换器是小端数,则需要反转,并在执行
Concat
时删除
reverse()
。如果我理解正确,则是关于
DWORD
“32位无符号整数”,这就是为什么我将
uint
UInt32
)以及他将DWORD转换为一些INT值,他需要将INT值转换为位数组(可能INT是我们都错了的情况)。无论如何,OP确实可以自己决定他的意思。
Convert.ToString
是否总是将数字视为大端数?旁注:
TrimStart('0')
似乎没有必要。例如,如果您使用
uint source=0
-结果将是空字符串,而预期结果(我认为)是带16个零的字符串。@Evk:谢谢!我同意Endian检查;但是由于
结果
仅显示
数组
包含正确的数据(对于单个
62000
测试),所以让我保持
TrimStart
原样。但这是因为您使用了
uint
。因为OP说62000表示为2个字节,所以必须使用
ushort
<他所用的code>INT可以表示任何东西,因为据我所知,它不是C#INT。使用
ushort
可以删除
TrimStart
。endian检查也有点奇怪,因为如果
BitConverter
不是小endian,则反转一次,然后在使用BitArray时再次反转。因此,如果位转换器是小端数,则需要反转,并在执行
Concat
时删除
reverse()
。如果我理解正确,则是关于
DWORD
“32位无符号整数”,这就是为什么我将
uint
UInt32
)以及他将DWORD转换为一些INT值,他需要将INT值转换为位数组(可能INT是我们都错了的情况)。无论如何,OP确实可以自己决定他的意思。