如何在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",如果有帮助的话?有人能帮我清理一下吗?

如何在C#中将单词或Nibble解释为数字

您可以使用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);
  }

通过使用括号将字符串视为字符数组,并通过强制转换将数字字符视为数字,可以实现从位到整数的硬编码转换。这是一个新手的解决方案,但我认为这也是一个合适的解决方案。