在C#中,如何将一个单词或一个字母解释为一个数字?
我不是来自低级开发背景,所以我不知道如何将下面的指令转换为整数 基本上我有一个微处理器,它告诉我哪些IO是活动的或非活动的。我向设备发送一个ASCII命令,它会回复一个单词,说明15个I/O中哪些是打开/关闭的。。。以下是说明:在C#中,如何将一个单词或一个字母解释为一个数字?,c#,binary,word,microprocessors,C#,Binary,Word,Microprocessors,我不是来自低级开发背景,所以我不知道如何将下面的指令转换为整数 基本上我有一个微处理器,它告诉我哪些IO是活动的或非活动的。我向设备发送一个ASCII命令,它会回复一个单词,说明15个I/O中哪些是打开/关闭的。。。以下是说明: 装置回答“A0001/”仅适用于DIn0,回答“A???/”适用于所有激活输入 Awxyz/-w=0到中MSB的高半字节?ASCII字符0001=1,1111=?,z=LSB的低半字节 在一天结束时,我只想把它转换成一个数字,告诉我15个(或16个?)输入中哪一个是
- 装置回答“A0001/”仅适用于DIn0,回答“A???/”适用于所有激活输入
- Awxyz/-w=0到中MSB的高半字节?ASCII字符0001=1,1111=?,z=LSB的低半字节
byte[] inputFromHardware = { 126, 42 };
ushort value = BitConverter.ToUInt16( inputFromHardware, index );
15(或16?)个输入中的哪一个是激活的
如果这些位是硬件标志,那么所有16位都用来表示某种意义是合理的。当位用于表示有符号数时,其中一个位用于表示正数与负数。由于硬件提供状态位,因此任何位都不应被解释为符号
如果想知道特定位是否处于活动状态,可以使用位掩码和&
运算符。例如,二进制掩码
0000 0000 0100
对应于十六进制数
0x0004
要了解右侧第三位是否已打开,请使用
bool thirdBitFromRightIsOn = (value & 0x0004 != 0);
更新
如果制造商说值8000(我假设十六进制)表示通道15处于活动状态,请如下所示:
string x = "A0001/"
int y = 0;
for (int i = 3; i >= 0; i--)
{
if (x[4-i] == '1')
y += (int)Math.Pow(2,i);
}
你的口罩
1000 0000 0000 0000 (binary)
8 0 0 0 (hex)
根据制造商提供的信息,最左边的位对应于通道15
您可以像这样使用该遮罩:
bool channel15IsOn = (value & 0x8000 != 0);
第二种选择(但仅适用于半字节)是使用数学库,如下所示:
string x = "A0001/"
int y = 0;
for (int i = 3; i >= 0; i--)
{
if (x[4-i] == '1')
y += (int)Math.Pow(2,i);
}
使用将字符串视为字符数组的功能,只需使用括号,并通过强制转换将数字字符视为数字,就可以将位转换为硬编码的整数。
这是一个新手解决方案,但我认为它也是一个合适的解决方案。我得到的第15个i/O的值是8000,这是如何工作的?从左边开始的第15个IO?你能把你用来计算8000的代码加到你的问题上吗?是的,从左边开始。我有一组16个输入通道(0-15),当我收到电信号时,设备返回“A8000”。“A”只是他们使用的标准。当我问制造商时,他们说8000是15频道,这是正确的,但当他们试图解释他们是如何得到答案时,我真的很困惑……谢谢巴德,感谢你的帮助。当你说
“A8000”
,这是一个字符串吗?或者,“A”从何而来?“A”只是制造商用来表示replyOk的标准,因此每个字符代表四个端口。通常,使用十六进制数字对这些端口的16种可能组合进行编码是有意义的,因此0-9A-F
。但是您似乎有1111=?
,我希望是1111=F
。例如,0101
(端口0和3处于活动状态)提供了什么?