我不是来自低级开发背景,所以我不确定如何将以下指令转换为整数......
基本上我有一个微处理器,告诉我哪些IO是活动的还是非活动的。我向设备发送一个ASCII命令,然后用WORD回复15个I / O中的哪一个打开/关闭......这是指令:
在一天结束时,我只想将其转换回一个数字,告诉我15个(或16个?)输入中的哪个输入有效。
我有一些东西连接到第15个I / O端口,我得到的回复是“A8000”,如果这有帮助吗? 有人可以帮我解决这个问题吗?
答案 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);
}
使用将字符串视为字符数组的功能,只需使用括号和数字字符作为数字进行转换,就可以将位转换为硬编码的整数。 这是一个新手的解决方案,但我认为这也是一个合适的解决方案。