Rid*_*hid 2 .net c# checksum xor
嗨,我想找到单个字符串的校验和.这是校验和的要求.
假设标题+ session + body + message ="这是测试字符串".我想计算这个的校验和.到目前为止,我开发了以下代码.
如果string length(byte[] data)是4的倍数,则正确计算校验和.
如果"data"不是4的倍数,我会收到异常
"System.IndexOutOfRangeException:索引超出了数组的范围".
我将从用户那里获取具有不同字符串长度的不同输入,因此字符串长度将是可变的(意味着一些时间用户可以仅在q和A中输入ABCDE,依此类推.).如何修复此异常问题并使用4的多个计算正确的校验和.
public string findchecksum(string userinput)
try
{
ASCIIEncoding enc = new ASCIIEncoding();
byte[] data = Encoding.ASCII.GetBytes(userinput);
byte[] checksum = new byte[4];
for (int i = 16; i <= data.Length - 1; i += 4)
{
checksum[0] = (byte)(checksum[0] ^ data[i]);
checksum[1] = (byte)(checksum[1] ^ data[i + 1]);
checksum[2] = (byte)(checksum[2] ^ data[i + 2]);
checksum[3] = (byte)(checksum[3] ^ data[i + 3]);
}
int check = 0;
for (int i = 0; i <= 3; i++)
{
int r = (Convert.ToInt32(checksum[i]));
int c = (-(r + (1))) & (0xff);
c <<= (24 - (i * 8));
check = (check | c);
}
return check.ToString("X");
Run Code Online (Sandbox Code Playgroud)
因为你i+3在循环中使用,你的数组大小必须始终可被4整除.data在进入循环之前,你应该扩展你的数组以满足那个要求:
byte[] data = Encoding.ASCII.GetBytes(cmd);
if (data.Length % 4 != 0)
{
var data2 = new byte[(data.Length / 4 + 1) * 4];
Array.Copy(data, data2, data.Length);
data = data2;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2052 次 |
| 最近记录: |