C# UTF-8字符串的校验和

C# UTF-8字符串的校验和,c#,encoding,utf-8,C#,Encoding,Utf 8,下面是校验和说明。 校验和是四个ASCII字符数字,表示字符的二进制和,包括 传输的第一个字符,最多包括校验和字段标识符字符。 要计算校验和,请将每个字符作为无符号二进制数相加,取 求和并执行2的补码。校验和字段是由四个十六进制数字表示的结果。 要验证接收数据的校验和是否正确,只需添加所有十六进制值,包括校验和。信息技术 应该等于零 这是ASCII字符串的实现,但我的输入字符串现在是UTF-8。 任何人都可以提出一些想法来修改UTF-8编码的实现。非常感谢 using System; using

下面是校验和说明。 校验和是四个ASCII字符数字,表示字符的二进制和,包括 传输的第一个字符,最多包括校验和字段标识符字符。 要计算校验和,请将每个字符作为无符号二进制数相加,取 求和并执行2的补码。校验和字段是由四个十六进制数字表示的结果。 要验证接收数据的校验和是否正确,只需添加所有十六进制值,包括校验和。信息技术 应该等于零

这是ASCII字符串的实现,但我的输入字符串现在是UTF-8。 任何人都可以提出一些想法来修改UTF-8编码的实现。非常感谢

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");
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
名称空间SIP2
{
//改编自VB.NET,选自图书馆技术人员博客
//  http://librarytechguy.blogspot.com/2009/11/sip2-checksum_13.html
公共类校验和
{
公共静态字符串ApplyChecksum(字符串strMsg)
{
int intCtr;
字符数组;
int intAscSum;
布尔·布恩卡里比特;
string strBinVal=string.Empty;
字符串strInvBinVal;
string strNewBinVal=string.Empty;
//将SIP消息传输到字符数组。循环遍历数组的每个字符,
//将字符转换为ASCII值并将该值添加到运行总数。
intAscSum=0;
chrray=strMsg.ToCharArray();
对于(intCtr=0;intCtr 0);
strBinVal=strBinVal.PadLeft(16,'0');
//接下来,反转二进制数中的所有位。
chraray=strBinVal.ToCharArray();
strInvBinVal=“”;
对于(intCtr=0;intCtr=0;intCtr--)
{
如果(blnCarryBit==true)
{
if(chrArray[intCtr]=“0”)
{
chrArray[intCtr]=“1”;
blnCarryBit=false;
}
其他的
{
chrArray[intCtr]=“0”;
blnCarryBit=true;
}
}
strNewBinVal=CHRRARY[intCtr]+strNewBinVal;
}
//最后,将二进制数字转换为十六进制值,附加到原始SIP消息中。
返回strMsg+(转换为16(strnewbanl,2)).ToString(“X”);
}
}
}
更换代码

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

将所有字节相加,因为一个UTF8字符可以超过一个字节。

您应该在此处发布代码,而不是链接到它。谢谢。我已经贴出来了。你有什么特别的问题吗?ASCII校验和本质上是字节校验和。因此,您可以只取UTF8字节,然后对它们进行校验和。为什么要计算校验和?您是否需要遵守某些特定的校验和实现?这是某种学术练习吗?您是如何验证ASCII字符串实现中的校验和的?如果计算UTF-8字符串的校验和并尝试以相同的方式验证校验和,会发生什么情况?校验和用于应用程序级别的SIP2消息错误检测。SIP2是图书馆自动化系统和自动化设备之间的通信协议。我的问题中已经描述了校验和算法。协议通信使用TCP套接字。
int i = 0;
for (i = 0; i < bytes.Length; i++)
{
    intAscSum = intAscSum + bytes[i];
}
byte[] bytes = Encoding.UTF8.GetBytes(strMsg);