如何在C#中将单词或Nibble解释为数字
本文关键字:Nibble 解释 数字 单词 | 更新日期: 2023-09-27 17:58:38
我不是低级别的开发背景,所以我不知道如何将下面的指令转换为整数。。。
基本上我有一个微处理器,它告诉我哪些IO是活动的或不活动的。我向设备发送了一个ASCII命令,它会回复一个WORD,说明15个I/O中的哪些是打开/关闭的。。。这是说明:
- 单元回答"A0001/"(仅DIn0打开),"A???/"(所有输入激活)
- Awxyz/-w=MSB在0到?ASCII字符0001=11111=?,z=LSB的低Nibble
在一天结束时,我只想能够将其转换回一个数字,告诉我15(或16?)个输入中的哪一个是活动的。
我有连接到第15个I/O端口的东西,得到的回复是"A8000",如果有帮助的话?有人能帮我清理一下吗?
您可以使用BitConverter类将字节数组转换为所需的整数格式。
如果您得到16位,请将它们转换为UInt16。
C#没有定义字节序。这是由你运行的硬件决定的。英特尔和AMD处理器都是小端序。您可以使用BitConverter.IsLittleEndian了解平台的端序。如果运行.NET的计算机和提供数据的硬件没有相同的端序,则必须交换这两个字节。
byte[] inputFromHardware = { 126, 42 };
ushort value = BitConverter.ToUInt16( inputFromHardware, index );
15(或16?)个输入中的哪一个是活动
如果这些比特是硬件标志,那么所有16个比特都被用来表示某种意义是合理的。当比特用于表示有符号数字时,其中一个比特用于表示正与负。由于硬件正在提供状态位,因此这些位都不应被解释为符号
如果您想知道特定的位是否处于活动状态,可以使用位掩码和&
运算符。例如,二进制掩码
0000 0000 0000 0100
对应于十六进制数
0x0004
要了解右起第三位是否打开,请使用
bool thirdBitFromRightIsOn = (value & 0x0004 != 0);
更新
如果制造商说值8000(我假设十六进制)表示通道15处于活动状态,则如下所示:
您的比特掩码
1000 0000 0000 0000 (binary)
8 0 0 0 (hex)
根据来自制造商的信息,最左边的比特对应于信道15。
你可以像一样使用这个面具
bool channel15IsOn = (value & 0x8000 != 0);
第二个选择(但仅适用于Nibbles)是使用这样的数学库:
string x = "A0001/"
int y = 0;
for (int i = 3; i >= 0; i--)
{
if (x[4-i] == '1')
y += (int)Math.Pow(2,i);
}
通过使用括号将字符串视为字符数组,并通过强制转换将数字字符视为数字,可以实现从位到整数的硬编码转换。这是一个新手的解决方案,但我认为这也是一个合适的解决方案。