4

我正在尝试对使用 hdlc 作为其数据包格式的串行端口设备进行逆向工程。根据文档,数据包应包含命令的按位反转(前 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);
        }
    }
4

3 回答 3

2

您必须使用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")))); 
于 2017-01-09T08:21:29.580 回答
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)

于 2017-01-09T08:13:32.460 回答
0

您的按位反转没有按照您的想法进行。以以下为例:

int i = 5;

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

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

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

于 2017-01-09T08:27:17.620 回答