C#中计算16进制的校验位

最近刚学C# 目前有一组通过串口过来的数据, 我该怎么弄让49 前面的数据传入到变量 然后再相加
68 20 DF 68 02 02 35 41 49 16

68+20+DF+68+02+02+35+41+49+16=249 只用总和的后两位

img

请直接贴代码 如果代码可以正常跑通达到我的需求,我会采纳,谢谢

参考GPT的内容和自己的思路,可以使用以下代码计算给定16进制字符串的校验位:

string hexString = "6820DF68020235414916";
int sum = 0;

// 将每两个字符解析为一个16进制数并相加
for (int i = 0; i < hexString.Length; i += 2)
{
    sum += Convert.ToInt32(hexString.Substring(i, 2), 16);
}

// 只保留总和的最后两位并转换为16进制字符串
string checksum = (sum % 256).ToString("X2");

将16进制字符串存储在hexString变量中,然后使用一个循环迭代字符串中的每个16进制数并将它们相加。最后,我们将总和模256并只保留最后两位,然后将其转换为一个16进制字符串以表示校验位。在这个例子中,校验位应该是F9。

回答不易,还请采纳!!!

该回答引用ChatGPT

int sum = 0;
private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    byte ReceiveData;
    ReceiveData = (byte)SerialPort1.ReadByte();
    int data = Convert.ToInt32(ReceiveData);
    sum += data;
}

// 在你需要的地方获取总和的后两位
int result = sum % 256;


“Devil组”引证GPT后的撰写:


private int checksum = 0;

private void SerialPort1DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    int dataLength = SerialPort1.BytesToRead;
    byte[] data = new byte[dataLength];
    SerialPort1.Read(data, 0, dataLength);
    
    foreach (byte b in data)
    {
        if (b == 0x49) // 如果当前字节是0x49,说明校验和累加已经结束
        {
            // 取出累加结果的最后两个字节
            int sum = checksum & 0xFFFF;
            int highByte = sum >> 8;
            int lowByte = sum & 0xFF;
            // 处理累加结果
            Console.WriteLine("Checksum is: {0:X2}{1:X2}", highByte, lowByte);
            // 清空累加器
            checksum = 0;
        }
        else
        {
            // 累加数据
            checksum += b;
        }
    }
}

参考gpt和自己的思路,以下是计算16进制数据的校验位的C#代码:


string hexString = "6820DF68020235414916";
int sum = 0;

for (int i = 0; i < hexString.Length; i += 2)
{
    string hex = hexString.Substring(i, 2);
    sum += Convert.ToInt32(hex, 16);
}

string checksum = sum.ToString("X2").Substring(sum.ToString("X2").Length - 2);


这段代码会将16进制数据字符串转换为整数,然后将每个整数相加。最后计算出的总和将转换为16进制字符串,并仅保留后两位,即为校验位。