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