计算char的按位反转

时间:2017-01-09 08:10:16

标签: c# bitwise-operators bitwise-xor

我正在尝试对使用hdlc作为其数据包格式的串行端口设备进行逆向工程。根据文档,数据包应包含命令的按位反转(前4个字节),在本例中为{{1 }}。使用原始程序时监视串行端口会显示按位反转应该是什么:

"HELO"

问题是,即使远程关闭,我也没有获得价值。

 HELO -> b7 ba b3 b0
 READ -> ad ba be bb

3 个答案:

答案 0 :(得分:2)

您必须使用字节,而不是使用字符

string source = "HELO";

// Encoding.ASCII: I assume that the command line has ASCII encoded commands only  
byte[] result = Encoding.ASCII
  .GetBytes(source)
  .Select(b => unchecked((byte)~b)) // unchecked: ~b returns int; can exceed byte.MaxValue
  .ToArray();

测试(让我们将result表示为十六进制)

// b7 ba b3 b0
Console.Write(string.Join(" ", result.Select(b => b.ToString("x2")))); 

答案 1 :(得分:1)

Char不是一个字节。你应该使用字节而不是字符。

所以this.cmd是一个字节数组?您可以使用BitConverter.ToUInt32()

PSEUDO:(你可以修复一些演员)

public uint checksum
{
    get
    {
        var cmdDec = BitConverter.ToUInt32(this.cmd, 0);
        return (cmdDec ^ 0xffffffff);
    }
}

如果this.cmd是一个字符串,您可以使用Encoding.UTF8.GetBytes(string)

从中获取一个字节数组

答案 2 :(得分:0)

你的按位反转并没有做你认为它正在做的事情。请采取以下措施,例如:

int i = 5;

var j = i ^ 0xFFFFFFFF;
var k = ~i;

第一个例子是通过对具有最大值的数字进行异或来执行反转。第二个值使用C#Bitwise-NOT ~运算符。

运行此代码后,j的{​​{1}}值将等于4294967290,而long的值将等于-6 k。它们的二进制表示将是相同的,但int将包含另外32位的0。还有一个显而易见的问题,即它们是完全不同的数字,因此根据您使用的内容,对值进行的任何数学运算都将完全不同。