C# 模式256示例

C# 模式256示例,c#,checksum,C#,Checksum,我的代码中有这一行,我似乎无法理解它是如何工作的-(为了找到我的问题) 我知道结果应该是89 checksum = 0- (277(16) mode 256) 但我不记得为什么了 这是C# 这是一个简单的校验和。背后的数学是: gen(data) = -sum(data) mod 256 由于(a+b)mod c=((a mod c)+(b mod c))mod c中间和已经可以减少到模256。强制转换为字节会隐式执行模256运算,两个字节之间的+=也是如此 最后,(字节)(0-lcs)执行

我的代码中有这一行,我似乎无法理解它是如何工作的-(为了找到我的问题)

我知道结果应该是89

checksum = 0- (277(16) mode 256)
但我不记得为什么了

这是C#


这是一个简单的校验和。背后的数学是:

gen(data) = -sum(data) mod 256
由于
(a+b)mod c=((a mod c)+(b mod c))mod c
中间和已经可以减少到模256。强制转换为
字节
会隐式执行模256运算,两个字节之间的
+=
也是如此

最后,
(字节)(0-lcs)
执行求反模256


因为即使在mod-256算术中,
x+(-x)=0
(根据定义),该校验和的属性是,如果将其与数据放在一起,则该组合的校验和为零。

这是一个简单的校验和。背后的数学是:

gen(data) = -sum(data) mod 256
由于
(a+b)mod c=((a mod c)+(b mod c))mod c
中间和已经可以减少到模256。强制转换为
字节
会隐式执行模256运算,两个字节之间的
+=
也是如此

最后,
(字节)(0-lcs)
执行求反模256



因为即使在mod-256算法中,
x+(-x)=0
(根据定义),该校验和也具有这样的特性:如果将其与数据放在一起,则该组合的校验和为零。

这看起来并不像C#。没有
模式
关键字。你不能写
277(16)
。这不是有效的C#@CodeCaster,除非op。。。不,根本无效这是命令的逻辑你怎么会有277?首先,它不适合放在一个字节中。这看起来不像C。没有
模式
关键字。你不能写
277(16)
。这不是有效的C#@CodeCaster,除非op。。。不,根本无效这是命令的逻辑你怎么会有277?这不适合放在一个字节的第一位,好吧,但计算不相加-总和是277(十六进制)或631(十二进制),那么它是如何达到89(十六进制)或137(十二进制)?@David12123它不仅是模256,而且是一个求反,-0x277 mod 256是0x89顺便说一句,小心C中的
%
运算符,对于有符号整数,它意味着余数,而不是真正的模:结果可能是负数。在这种情况下,您当然可以轻松地转换为
字节。或者使用
&0xFF
,这可以归结为相同的东西,但不改变类型。对不起,我看不到,你能告诉我怎么做吗?我试过用计算器,也试过用铅笔。。。。我们先取0x277 mod 256,换句话说,取botton 8位:0x77。用二进制编写:01110111。用十六进制的“
-x=~x+1
”:
~01101111+1=10001000+1=10001001
,这是“
0x89
”。好的,但计算结果不相加-总和是277(十六进制)或631(十二进制),那么它是如何达到89(十六进制)或137(十二进制的)?@David12123它不仅是模256,也是一个求反,-0x277 mod 256是0x89顺便说一句,注意C#中的
%
运算符,对于有符号整数,它表示余数,而不是真正的模:结果可能是负数。在这种情况下,您当然可以轻松地转换为
字节。或者使用
&0xFF
,这可以归结为相同的东西,但不改变类型。对不起,我看不到,你能告诉我怎么做吗?我试过用计算器,也试过用铅笔。。。。我们先取0x277 mod 256,换句话说,取botton 8位:0x77。用二进制编写:01110111。应用否定,使用十六进制的
-x=~x+1
~01101111+1=10001000+1=10001001
,即
0x89
gen(data) = -sum(data) mod 256