计算 char 的按位反转

Calculating bitwise inversion of char

我正在尝试对文档中的数据包使用 hdlc 的串行端口设备进行逆向工程 format.Based,数据包应包含命令的按位反转(前 4 个字节),在本例中是 "HELO"。使用原程序时监控串口显示按位取反应该是什么:

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

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

public object checksum
    {

        get
        {
            var cmdDec = (int)Char.GetNumericValue((char)this.cmd);
            return (cmdDec ^ 0xffffffff);
        }
    }

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)

从中获取字节数组

您必须使用 bytes,而不是 chars:

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")))); 

您的按位反转并没有按照您认为的那样进行。以下面的例子:

int i = 5;

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

第一个示例按照您的方式执行反转,通过对数字与最大值进行异或运算。第二个值使用 C# Bitwise-NOT ~ 运算符。

在 运行 这段代码之后,j 将是一个 long 值等于 4294967290,而 k 将是一个 int 值等于 - 6.它们的二进制表示形式相同,但 j 将包含另外 32 位的 0。还有一个明显的问题是它们是完全不同的数字,因此根据您使用的是什么,对这些值执行的任何数学运算都会完全不同。