最近刚学C# 目前有一组通过串口过来的数据, 我该怎么弄让49 前面的数据传入到变量 然后再相加
68 20 DF 68 02 02 35 41 49 16
68+20+DF+68+02+02+35+41+49+16=249 只用总和的后两位
请直接贴代码 如果代码可以正常跑通达到我的需求,我会采纳,谢谢
参考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进制字符串,并仅保留后两位,即为校验位。