如何将WORD或Nibble解释为C#中的数字?

时间:2013-02-11 18:54:15

标签: c# binary word microprocessors

我不是来自低级开发背景,所以我不确定如何将以下指令转换为整数......

基本上我有一个微处理器,告诉我哪些IO是活动的还是非活动的。我向设备发送一个ASCII命令,然后用WORD回复15个I / O中的哪一个打开/关闭......这是指令:

  • 单位答案“A0001 /”仅用于DIn0开启,“A ???? /”表示所有输入有效
  • Awxyz / - w = 0到0的MSB高半字节? ASCII字符0001 = 1,1111 = ?, z = LSB的低半字节。

在一天结束时,我只想将其转换回一个数字,告诉我15个(或16个?)输入中的哪个输入有效。

我有一些东西连接到第15个I / O端口,我得到的回复是“A8000”,如果这有帮助吗? 有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

您可以使用BitConverter类将字节数组转换为您需要的整数格式。

如果你得到16位,convert them to a UInt16

C#没有定义endianness。这取决于您运行的硬件。英特尔和AMD处理器都是小端的。您可以使用BitConverter.IsLittleEndian了解平台的字节序。如果运行.NET的计算机和提供数据的硬件没有相同的字节序,则必须交换这两个字节。

byte[] inputFromHardware = { 126, 42 };
ushort value = BitConverter.ToUInt16( inputFromHardware, index );
  

15个(或16个?)输入中的哪个是活动的

如果这些位是硬件标志,那么所有16位用于表示某些东西是合理的。当比特用于表示带符号的数字时,其中一个比特用于表示正与负。由于硬件提供状态位,因此不应将任何位解释为符号。

如果您想知道某个特定位是否处于活动状态,您可以使用位掩码和&运算符。例如,二进制掩码

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

答案 1 :(得分:0)

第二种选择(但仅适用于Nibbles)是使用这样的Math库:

  string x = "A0001/"
  int y = 0;
  for (int i = 3; i >= 0; i--)
  {
      if (x[4-i] == '1')
      y += (int)Math.Pow(2,i);
  }

使用将字符串视为字符数组的功能,只需使用括号和数字字符作为数字进行转换,就可以将位转换为硬编码的整数。 这是一个新手的解决方案,但我认为这也是一个合适的解决方案。