J'ai écrit une fonction de calcul de checksum dans Android / Java. La fonction comme suit
void CalculateCheckSum( byte[] bytes ){
short CheckSum = 0, i = 0;
for( i = 0; i < bytes.length; i++ ){
CheckSum = (short) ((short)CheckSum + (short)bytes[i]);
}
Log.i("Checksum", Integer.toHexString(CheckSum));
}
6 Réponses :
La valeur d'un octet est allée entre Mais votre valeur octet code> selon Java Docs : P>
2 ^ (- 7) code> et (2 ^ 7) -1 code> (-128 à 127). P>
blockQuote>
0xef code> (en décimal 239) a déjà atteint la limite d'un octet. C'est ce que la somme donne les mauvais nombres. P>
Est un type de données qui prend en charge la valeur de 8 bits (c'est-à-dire 0-255) en Java
Il n'y a pas de type code> non signé code> de type primitif dans Java Afaik. Mais vous pouvez trouver d'autres dépendances qui fournit non signé type code>.
Essayez ceci Link
0xef s'inscrit dans un octet. Il suffit de la valeur -17 lorsque vous l'utilisez dans une expression. Que seul ne perturbera pas le calcul.
Utilisez un débogueur et déboguer votre code. Généralement, si vous continuez à ajouter des trucs, même si vous utilisez un Java fait tous les calculs arithmétiques utilisant int code> ou un long code>, il est lié à débordement à un moment donné, vous obtiendrez ainsi des résultats inattendus. Il est préférable d'utiliser un algorithme de contrôle standard ou l'une des classes déjà disponibles telles que CRC32 code> ou adler31 code>. Quant à votre code, vous semblez traiter le résultat comme un entier, alors pourquoi lancer à court code> en premier lieu? int code> 'S, donc votre octet code> s est converti en int code> et ceux qui ne correspondent pas à un octet ressembleront à ceci comme int code>' S: ffffffef code> (-17). Naturellement, vous n'avez besoin que de la valeur d'octet réelle, vous devez donc vous éteindre tout le reste en utilisant (0xFF & B) code>. Donc, votre boucle que de devient quelque chose comme ceci: p>
Je souhaite envoyer un peu de paquet à un équipement incorporé qui utilise la méthode de contrôle ci-dessus pour calculer. donc je ne peux pas changer CRC32 ou autre
Vous devez utiliser des entiers comme entrée si vous les convertissez avec:
String CalculateCheckSum( Integer[] bytes ){
Integer CheckSum = 0, i = 0;
for( i = 0; i < bytes.length; i++ ){
CheckSum += bytes[i];
}
return Integer.toHexString(CheckSum);
}
Mais il n'a pas d'entiers ni d'entiers, comme entrée.
Comme mentionné ci-dessus par Aprian, tandis que l'octet dispose des 8 bits nécessaires pour vos valeurs hexagonales, il ne peut stocker que les valeurs entre -128 et 127.
Donc, une solution rapide et facile serait d'utiliser la prochaine primitive plus grande, dans ce cas qui me donne la sortie: p> court code>. Checksum: ce4
Cela signera toujours. Vous devez masquer.
Le problème ici est le Cela n'a rien à voir avec le débordement des octets, contrairement à la plupart des autres réponses. Vous n'avez pas à changer le type de tableau non plus. P> (court) code> coulée de octets [i] code>. Il étend le signe. Vous devriez changer (court) octets [i] code> sur (octets [i] & 0XFF) code>. Cela vous donnera la bonne réponse. P>
Enfin, j'ai eu ...
Code corrigé p> Merci à Taprian et d'autres P> P> P>
Merci à Taprian? Il était complètement faux et il ne vous a pas donné ce code. Seules deux réponses vous ont donné ce code et vous devez en accepter l'une de celles-ci, pas la vôtre. Poster le vôtre lorsque ces autres existent est une perte de temps et d'espace.