2016-10-26 9 views
0

Salut, je convertis l'application C# en android et je calcule la somme de contrôle à partir du tableau d'octets comme dans C#. Mais il renvoie une valeur incorrecte en dessous du tableau d'octets. Quelqu'un s'il vous plaît aider à ce sujet. Merci.Calculer la somme de contrôle retourner la valeur erronée dans android

C réseau # octet:

[41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41 , 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132 , 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41 , 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132 , 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41 , 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132 , 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41 , 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132 , 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41 , 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132 , 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41 , 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132, 41, 132]

C# code:

public static uint CalculateChecksum(byte[] buffer, int offset, int length) 
     { 
      uint cs = 0; 
      for (int i = offset; i < offset + length & i < buffer.Length; i += 2) 
      { 
       ushort s = BitConverter.ToUInt16(buffer, i); 
       cs += s; 
      } 

      return cs; 
     } 
valeur

obtenir 4.736.620 convertir ce valeur au tableau d'octets donne [108,70,72,0]

tableau d'octets applications

[41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124, 41, -124]

code Android:

public static long checkSum(byte[] buffer, int offset, int length) { 
     long cs = 0; 
     for (int i = offset; i < offset + length & i < buffer.length; i += 2) { 

      ByteBuffer bb = ByteBuffer.allocate(2); 
      bb.order(ByteOrder.LITTLE_ENDIAN); 
      bb.put(buffer[i]); 
      bb.put(buffer[i+1]); 
      long shortVal = bb.getShort(0); 

      cs += shortVal; 
     } 
     return cs; 
    } 
valeur

obtenir la conversion de ce val -4438420 à matrice UE octets

ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt((int) value).array(); 

donne [108,70, -68, -1]

Qu'est-ce que je fais mal? Pourquoi son retour valeur différente? S'il vous plaît aidez-moi. Je vous remercie.

Répondre

0

Le contenu du tableau d'octets diffère (par exemple, la deuxième position était différente en C# par rapport à Android). Donc, de mon point de vue, il est normal que le code renvoie des sommes de contrôle différentes.

Édition: Le contenu du tableau diffère en effet. L'un se compose d'octets signés l'autre d'octets non signés. C'est une différence (même si la représentation des bits peut être la même) et n'a rien à voir avec le big endian contre le petit endian. Le problème que vous rencontrez est parce que dans la version Java, vous utilisez à nouveau des shorts signés, alors que la version C# utilisait des shorts non signés. Là, le signe rend le calcul erroné par un terme qui est un multiple de 2^16. En fait, si vous utilisiez int16 signé en C#, vous obtiendrez également le même résultat que dans la solution Android.

La solution simple est donc de demander un entier à partir du tampon d'octets, pas un court, puisque celui-ci est signé. Sinon, vous pouvez ajouter 2^16 en cas que le court est négatif (qui un ushort ne peut jamais être):

public static long checkSum(byte[] buffer, int offset, int length) { 
    long cs = 0; 
    for (int i = offset; i < offset + length & i < buffer.length; i += 2) { 

     ByteBuffer bb = ByteBuffer.allocate(2); 
     bb.order(ByteOrder.LITTLE_ENDIAN); 
     bb.put(buffer[i]); 
     bb.put(buffer[i+1]); 
     long shortVal = bb.getShort(0); 
     if (shortVal < 0) { shortVal += (1 << 16); } 
     cs += shortVal; 
    } 
    return cs; 
} 
+0

Ce tableau d'octets était au format bigEndian qui signifie (-124 + 256 = 132). Donc c'est pourquoi je deviens array byte de la valeur de retour au format LittleEndian et dans le tableau java byte sont signés (-127 à 127) dans C# its unsigned (0 à 256) – Nas

+0

@Nas Une différence dans si une valeur est signée ou non est une différence de valeur, encore. – Georg

+0

vous voulez dire par exemple pour la deuxième position devrait être 132 heures non? – Nas