我正在尝试对使用hdlc作为其数据包格式的串行端口设备进行逆向工程。根据文档,数据包应包含命令的按位反转(前4个字节),在本例中为{{1 }}。使用原始程序时监视串行端口会显示按位反转应该是什么:
"HELO"
问题是,即使远程关闭,我也没有获得价值。
HELO -> b7 ba b3 b0
READ -> ad ba be bb
答案 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。还有一个显而易见的问题,即它们是完全不同的数字,因此根据您使用的内容,对值进行的任何数学运算都将完全不同。