计算 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。还有一个明显的问题是它们是完全不同的数字,因此根据您使用的是什么,对这些值执行的任何数学运算都会完全不同。
我正在尝试对文档中的数据包使用 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。还有一个明显的问题是它们是完全不同的数字,因此根据您使用的是什么,对这些值执行的任何数学运算都会完全不同。