【问题标题】:How do I interpret a WORD or Nibble as a number in C#?如何在 C# 中将 WORD 或 Nibble 解释为数字?
【发布时间】:2013-02-11 18:54:15
【问题描述】:

我不是低级开发背景,所以不知道如何将下面的指令转换为整数...

基本上,我有一个微处理器,它告诉我哪些 IO 处于活动状态或处于非活动状态。我向设备发送一个 ASCII 命令,它会回复一个 WORD,说明 15 个 I/O 中的哪一个是打开/关闭的……指令如下:

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

在一天结束时,我只想能够将其转换回一个数字,该数字将告诉我 15 个(或 16 个?)输入中的哪一个处于活动状态。

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

【问题讨论】:

  • 当你说"A8000"时,那是一个字符串吗?否则,那个“A”是从哪里来的?
  • “A”只是制造商用来表示回复的标准
  • 好的,所以每个字符代表四个端口。通常使用十六进制数字对这些端口的 16 种可能组合进行编码是有意义的,因此 0-9A-F。但你似乎有1111=?,我期望1111=F。那么0101(端口 0 和 3 活动)给出了什么?

标签: c# binary word microprocessors


【解决方案1】:

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

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

C# 没有定义endianness。这取决于您运行的硬件。 Intel 和 AMD 处理器是 little-endian。您可以使用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);

【讨论】:

  • 第 15 个 I/O 开启时我得到的值为 8000,它是如何工作的?
  • 左起第 15 个 IO?您可以将用于获得 8000 的代码添加到您的问题中吗?
  • 是的,从左边开始。我有一组 16 个输入通道(0 - 15),当我收到电信号时,设备返回“A8000”。 “A”只是他们使用的标准。当我问制造商时,他们说 8000 是 15 频道,这是正确的,但当他们试图解释他们如何得到答案时,我真的很困惑......
  • 谢谢老兄,感谢您的大力帮助。
【解决方案2】:

第二个选择(但仅适用于 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);
  }

使用将字符串视为字符数组的能力,只需使用方括号和数字字符作为数字通过强制转换,您就可以将位转换为硬编码的整数。 这是一个新手解决方案,但我认为它也是正确的。

【讨论】:

    猜你喜欢
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2019-08-08
    • 2020-09-14
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多