【发布时间】:2012-10-17 20:33:01
【问题描述】:
我有一个字符串“0AAE0000463130004144430000”,我需要计算构成该字符串的十六进制字节的二进制补码校验和。
上面示例字符串的公式是
- 将值相加:0A + AE + 00 + 00 + 46 + 31 + 30 + 00 + 41 + 44 + 43 + 00 + 00 = 27(丢弃溢出)
- 从 0x100 = 0xD9 中减去结果
D9 是此示例的正确校验和,但我无法从 C# 中的字符串中解析出两位十六进制值。我当前的代码如下:
string output = "0AAE0000463130004144430000";
long checksum = 0;
char[] outputBytes = output.TrimStart(':').ToCharArray();
foreach (var outputByte in outputBytes)
{
checksum += Convert.ToInt32(outputByte);
checksum = checksum & 0xFF;
}
checksum = 256 - checksum;
但是,据我所知,这是对 ASCII 值求和,并对每个单独的字符进行求和。
【问题讨论】:
-
好吧,你正在遍历字符串中的每个字符——你不是先将每一对转换为它的字节表示。
-
如果我切换到 byte[] outputBytes = GetBytes(output.TrimStart(':'));我仍然得到相同的(不正确的)值。
标签: c# twos-complement