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");
}
}
}
Sie sollten den Code hier anstelle eines Links zu ihm posten. – juharr
danke. Ich habe es gepostet. – Felix
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? –