计算十六进制字符串的二进制补码校验和

Cra*_*ake 4 c# twos-complement

我有一个字符串"0AAE0000463130004144430000",我需要计算构成字符串的十六进制字节的二进制补码校验和.

上面示例字符串的公式是

  1. 求和值:0A + AE + 00 + 00 + 46 + 31 + 30 + 00 + 41 + 44 + 43 + 00 + 00 = 27(丢弃溢出)
  2. 从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;
Run Code Online (Sandbox Code Playgroud)

但是,这是我可以告诉的ASCII值的总和,并为每个单独的字符执行此操作.

L.B*_*L.B 10

您可以SoapHexBinary在System.Runtime.Remoting.Metadata.W3cXsd2001中使用类.

soapHexBinary.Value 属性将返回一个字节数组

string hexString = "0AAE0000463130004144430000";
byte[] buf = SoapHexBinary.Parse(hexString).Value;

int chkSum = buf.Aggregate(0, (s, b) => s += b) & 0xff;
chkSum = (0x100 - chkSum) & 0xff;

var str = chkSum.ToString("X2"); // <-- D9
Run Code Online (Sandbox Code Playgroud)

  • 为什么我不立即查看可靠的System.Runtime.Remoting.Metadata.W3cXsd2001命名空间?:) (11认同)