我希望能够从十六进制字节转换为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());
}
}发布于 2014-07-22 17:24:53
下面是整个方法的一个简单的版本:
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,01000000或10000000。
~反过来,把所有的1变成0,反之亦然。实际上,您使用的是11111110、11111101、11111011、11110111、11101111、11011111、101111或01111111,保留了所有其他位元,但清除了一个位。
然后,表达式的第二部分:
| (state * bitValue)在这里,我们将state (0或1 )与bitValue相乘,从上面得到相同的7-0和1位设置值,并将结果合并到最终结果中。实际上,如果state为1,则设置位,否则不设置。
因此,该表达式如下:
state是1),设置它https://stackoverflow.com/questions/24893640
复制相似问题