我希望能够将十六进制字节转换为8位二进制字符串或位数组,修改字符串中的单个位并转换回十六进制字节。
理论上我会得到
的输入 "FF"
将其转换为二进制并更改其中一个位
"11111111" => "11110111"
并将其转换回来
"F7"
我无法使Convert.ToInt32()正常工作,格式(“X2”)也无法正常工作。 有什么想法吗?
private void changeDObit(int port, int bitNum, int state)
{
try
{
byte currentstate;
instantDoCtrl1.Read(port, out currentstate);
string data0Hex = currentstate.ToString("X2");
string data0Binary = Convert.ToString(Convert.ToInt32(data0Hex, 16), 2).PadLeft(data0Hex.Length * 4, '0');
if (!data0Binary[bitNum].Equals(state))
{
StringBuilder sb = new StringBuilder(data0Binary);
sb[bitNum] = (char)state;
data0Binary = sb.ToString();
string strHex = string.Format("{0:X2}", sb);
byte outdata = Convert.ToByte(strHex);
instantDoCtrl1.Write(port, outdata);
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
答案 0 :(得分:2)
这是您整个方法的简单版本:
private void changeDObit(int port, int bitNum, int state)
{
byte currentstate;
instantDoCtrl1.Read(port, out currentstate);
var bitValue = 1 << bitNum;
currentstate = (currentstate & ~bitValue) | (state * bitValue);
instantDoCtrl1.Write(port, outdata);
}
假设:
它的工作方式如下:
当你将和两个数字一起按位时,你实际上最终得到了两者中所有的1位。
所以,表达式的第一部分:
(currentstate & ~bitValue)
和一起currentstate
和~bitValue
。
那么,~bitValue
是什么?好吧,在这种情况下,bitValue
设置为1位,因此它的二进制值为00000001,00000010,00000100,00001000,00010000,00100000,010000或10000000。
~
反转,将所有1&n转换为0,反之亦然。实际上,您正在使用11111110,11111101,111111011,11110111,111101111,11011111,10111111或01111111进行currentstate
,保留所有其他位,但清除一位。
然后,表达式的第二部分:
| (state * bitValue)
这里我们将state
乘以bitValue
乘以state
,从上面乘以相同的7-zeroes-and-1-bit-set值,结果为 进入最终结果。实际上,如果state
为1,我们会设置位,否则我们不会。
因此,表达式如下: