Calculer la sum de contrôle du complément à deux de la chaîne hexadécimale

J’ai une chaîne “0AAE0000463130004144430000” et j’ai besoin de calculer la sum de contrôle du complément à deux des octets hexadécimaux constituant la chaîne.

La formule pour l’exemple de chaîne ci-dessus est

  1. Somme des valeurs: 0A + AE + 00 + 00 + 46 + 31 + 30 + 00 + 41 + 44 + 43 + 00 + 00 = 27 (éliminer le trop-plein)
  2. Soustrayez le résultat de 0x100 = 0xD9

D9 est la sum de contrôle correcte pour cet exemple, mais je ne parviens pas à parsingr les valeurs hexadécimales à deux chiffres de la chaîne en C #. Mon code actuel est ci-dessous:

ssortingng 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; 

Cependant, ceci résume les valeurs ASCII autant que je peux dire, et le fait pour chaque caractère individuel.

Vous pouvez utiliser la classe SoapHexBinary dans System.Runtime.Remoting.Metadata.W3cXsd2001.

soapHexBinary.Value propriété soapHexBinary.Value vous retournera un tableau d’octets

 ssortingng hexSsortingng = "0AAE0000463130004144430000"; byte[] buf = SoapHexBinary.Parse(hexSsortingng).Value; int chkSum = buf.Aggregate(0, (s, b) => s += b) & 0xff; chkSum = (0x100 - chkSum) & 0xff; var str = chkSum.ToSsortingng("X2"); // <-- D9 

Essayez ceci à la place. Saisissez deux caractères à la fois à l’aide de SubSsortingng et lisez la paire de caractères sous forme hexadécimale à l’aide de int.Parse avec NumberStyles.AllowHexSpecifier.

 ssortingng output = "0AAE0000463130004144430000"; int checksum = 0; // You'll need to add error checking that the ssortingng only contains [0-9A-F], // is an even number of characters, etc. for(int i = 0; i < output.length; i+=2) { int value = int.Parse(output.SubString(i, 2), NumberStyles.AllowHexSpecifier); checksum = (checksum + value) & 0xFF; } checksum = 256 - checksum;