如何在使用返回类型计算校验和时删除前两个元素是 Char



我有一个续集0001wglod;1;

在计算其校验和时。getCheckSum(0001wglod;1;)

校验和函数:

'

public char GetChecksum(string command)
{
System.Text.Encoding enc - System.Text.Encoding.GetEncoding ("iso-8859-1");
byte [] data = enc.GetBytes(command);
int checksum = 0;
for each (byte checksum_data in data)
{
checksum +=checksum_data ;
}
byte checksum_OR = (byte) (checksum | 0x80);
checksum_OR  &= 0xff;
return (char) checksum_OR  ;
}`

它返回 C285 我想从一开始就消除 C2 我只想要 85 ,如何消除 C2 以进行计算校验和,需要帮助。

您遇到的问题是字符编码。您的方法返回(char)0x85这是下一行 (http://www.fileformat.info/info/unicode/char/85/index.htm) 的 unicode 字符。

如果您查看该页面,它会告诉您该字符在各种其他编码中是什么。最重要的是,在 UTF-8 中,它被编码为 0xC2 0x85 (c285)。

因此,问题与计算校验和的方法无关,而是一旦您获得一个字节(0x85),您就会将其转换为Unicode字符,然后在将其写入文件时将其编码为UTF-8。

如果要将字节值写入文件,则应使用适当的方法来执行此操作。或者,如果您要以 UTF-8 格式读取该文件,那么您将在该位置获得正确的字符(因为如果您以相同的编码读取和写入,那么您输入和返回的内容将是相同的)。

因此,您需要问的问题是,文件是否需要正确,或者当您从文件中读入和读出文件时,它只需要做正确的事情。如果没有更多关于您正在做的事情的背景,我们就无法轻松回答这个问题。

我建议进一步阅读字符编码和编写二进制文件。

你可以用这样的简单循环来做到这一点

string in = "C285"; //Your output, for example C285 here. You can convert your sum return to this
string out="";
for (int i = 2; i <= in.Count() - 1; i++) {
out += in[i].ToString();
}

此代码开始将第一个字符串写入从第 3 个字符到下一个字符的第二个字符串。 希望对您有所帮助

使用未选中禁用溢出检查并使用字节数据类型执行校验和加法。这样,所有计算都保持在字节范围 (0x00..0xff)。

byte GetChecksum(string command)
{
var encoding = System.Text.Encoding.GetEncoding("iso-8859-1");
var data = encoding.GetBytes(command);
byte sum = 0;
unchecked
{
foreach (var b in data)
{
sum += b;
}
}
sum |= 0x80; // if you really want to have your checksum always be >= 0x80, which isn't part of "traditional" checksum calculation
return sum;
}

编辑:根据提问者的请求更新了我的代码。

最新更新