2017-08-10 2 views
-2

Unten ist die Prüfsummenbeschreibung. Die Prüfsumme besteht aus vier ASCII-Zeichen, die die binäre Summe der Zeichen einschließlich des ersten Zeichens der Übertragung und bis einschließlich der Feldkennung der Prüfsumme darstellen. Um die Prüfsumme zu berechnen addiere jedes Zeichen als eine vorzeichenlose Binärzahl, nimm die unteren 16 Bits der Summe und führe ein Zweierkomplement aus. Das Prüfsummenfeld ist das Ergebnis, das durch vier Hexadezimalziffern dargestellt wird. Um die korrekte Prüfsumme für empfangene Daten zu überprüfen, fügen Sie einfach alle Hex-Werte einschließlich der Prüfsumme hinzu. Es sollte gleich Null sein.Prüfsumme für UTF-8 Zeichenfolge

Dies ist die Implementierung für ASCII-Zeichenfolge, aber meine Eingabezeichenfolge ist jetzt UTF-8. Jeder gibt eine Idee, die Implementierung für UTF-8-Codierung zu überarbeiten. Vielen Dank.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace SIP2 
{ 
    // Adapted from VB.NET from the Library Tech Guy blog 
    // http://librarytechguy.blogspot.com/2009/11/sip2-checksum_13.html 

    public class CheckSum 
    { 
     public static string ApplyChecksum(string strMsg) 
     { 
      int intCtr; 
      char[] chrArray; 
      int intAscSum; 
      bool blnCarryBit; 
      string strBinVal = String.Empty; 
      string strInvBinVal; 
      string strNewBinVal = String.Empty; 

      // Transfer SIP message to a a character array.Loop through each character of the array, 
      // converting the character to an ASCII value and adding the value to a running total. 

      intAscSum = 0; 
      chrArray = strMsg.ToCharArray(); 

      for (intCtr = 0; intCtr <= chrArray.Length - 1; intCtr++) 
      { 
       intAscSum = intAscSum + (chrArray[intCtr]); 
      } 

      // Next, convert ASCII sum to a binary digit by: 
      // 1) taking the remainder of the ASCII sum divided by 2 
      // 2) Repeat until sum reaches 0 
      // 3) Pad to 16 digits with leading zeroes 

      do 
      { 
       strBinVal = (intAscSum % 2).ToString() + strBinVal; 
       intAscSum = intAscSum/2; 
      } while (intAscSum > 0); 

      strBinVal = strBinVal.PadLeft(16, '0'); 

      // Next, invert all bits in binary number. 
      chrArray = strBinVal.ToCharArray(); 
      strInvBinVal = ""; 

      for (intCtr = 0; intCtr <= chrArray.Length - 1; intCtr++) 
      { 
       if (chrArray[intCtr] == '0') { strInvBinVal = strInvBinVal + '1'; } 
       else { strInvBinVal = strInvBinVal + '0'; } 
      } 


      // Next, add 1 to the inverted binary digit. Loop from least significant digit (rightmost) to most (leftmost); 
      // if digit is 1, flip to 0 and retain carry bit to next significant digit. 

      blnCarryBit = true; 
      chrArray = strInvBinVal.ToCharArray(); 

      for (intCtr = chrArray.Length - 1; intCtr >= 0; intCtr--) 
      { 
       if (blnCarryBit == true) 
       { 
        if (chrArray[intCtr] == '0') 
        { 
         chrArray[intCtr] = '1'; 
         blnCarryBit = false; 
        } 
        else 
        { 
         chrArray[intCtr] = '0'; 
         blnCarryBit = true; 
        } 
       } 
       strNewBinVal = chrArray[intCtr] + strNewBinVal; 
      } 

      // Finally, convert binary digit to hex value, append to original SIP message. 
      return strMsg + (Convert.ToInt16(strNewBinVal, 2)).ToString("X"); 
     } 
    } 
} 
+0

Sie sollten den Code hier anstelle eines Links zu ihm posten. – juharr

+0

danke. Ich habe es gepostet. – Felix

+1

Mit was genau _haben Sie Probleme? Die Prüfsumme für ASCII ist im Wesentlichen eine Prüfsumme von Bytes. Sie könnten also einfach die UTF8 Bytes und die Prüfsumme nehmen. Warum berechnen Sie eine Prüfsumme? Gibt es eine bestimmte Checksum-Implementierung, die Sie einhalten müssen? Ist das eine Art akademischer Übung? –

Antwort

0

der Code ersetzen

for (intCtr = 0; intCtr <= chrArray.Length - 1; intCtr++) 
{ 
    intAscSum = intAscSum + (chrArray[intCtr]); 
} 

chrArray[intCtr] wird Eingang ASCII String den ASCII-Code in dezimalen ouput, zum Beispiel "A" ist 65. ASCII-Codierung verwendet nur 1 Byte. UTF-8 verwendet ein Byte oder mehr als ein Byte, um das UTF-8-Zeichen darzustellen. Ich denke, chrArray[intCtr] ist für ASCII ausgelegt - daher ist die Eingabe von UTF-8 (mehr als ein Byte) nicht sinnvoll.

Mit

int i = 0; 
for (i = 0; i < bytes.Length; i++) 
{ 
    intAscSum = intAscSum + bytes[i]; 
} 
byte[] bytes = Encoding.UTF8.GetBytes(strMsg); 

up alle Bytes, weil ein UTF8 char mehr als ein Byte sein kann.

Verwandte Themen