C# C语言中Dword到位数组的转换#
我在一个应用程序中工作,该应用程序使用LibnoDave库连接到西门子PLC。我得到一个Dword值,我把它转换成一个INT值,但现在我需要把这个INT值转换成一个位数组。例如,我得到一个INT值,即二进制中的620001111001000110000. 我需要那个值。如何做到这一点?如果要用二进制表示C# C语言中Dword到位数组的转换#,c#,bit,dword,C#,Bit,Dword,我在一个应用程序中工作,该应用程序使用LibnoDave库连接到西门子PLC。我得到一个Dword值,我把它转换成一个INT值,但现在我需要把这个INT值转换成一个位数组。例如,我得到一个INT值,即二进制中的620001111001000110000. 我需要那个值。如何做到这一点?如果要用二进制表示uint,请尝试使用Convert类: uint source = 62000; string result = Convert.ToString(source, 2); Co
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确实可以自己决定他的意思。