c# - 将 CRC 函数从 C++ 转换为 C#

标签 c# c++

我正在尝试从 C++ 转换此函数

BYTE serial::CalcCRC(BYTE start, const BYTE *buffer, DWORD lenght) 
{
    BYTE CRC = start; //...
    for(DWORD count = 0 ; count < lenght ; count++) CRC += buffer[count];
    return (0-CRC);
}

到 C#。 这是我的 C# 代码:

 public byte CalcCRC(byte start, byte[] buffer, int length)
 {
     byte crc = start;
     for (int i = 0; i < length; i++) crc += buffer[i];
     return (0 - crc);
 }

但是我在最后一行得到这个错误:

error CS0266: Cannot implicitly convert type 'int' to 'byte'. An explicit conversion exists (are you missing a cast?)

如何将上述函数转换为 C#?此外,我认为 C++ 函数在大多数情况下可能会溢出,我会在 C# 端得到相同的行为吗?

好吧,现在我认为转换可能会解决错误 - 但我的 C# 函数是否会得到与 C++ 函数相同的行为,主要是由于溢出等可能发生的行为。

最佳答案

问题是当您执行“0 - crc”时,您的原始字节被转换为整数。所以你需要做的是有最后一行

return (byte)(0-crc);

这应该可以解决问题。

它将自身“转换”为整数的原因是数值默认为整数。并执行 Integer - Byte = Integer

编辑: 关于溢出是不会发生的,但是为了避免可能出现的问题可以确保该值不超过255

所以你要做的就是进行额外的检查

if( crc + buffer[i] < Byte.MaxValue )
    crc += buffer[i];

关于c# - 将 CRC 函数从 C++ 转换为 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32866208/

相关文章:

c# - 为什么单击 ZedGraph 时我的图表上会出现垂直线?

c# - C# 是否包含 IParsable<T> 或 ITryParsable<T>?

c# - WebClient.UploadValues() 不返回响应

c++ - 多态性 c++,试图访问从抽象基类派生的类的成员函数

c# - 路由室内认识步骤

c# - AsyncCallback 没有被第二次调用

c++ - 如何让C++程序从外部文件中读取算法?

c++ - 皮肤 WinAPI 控件

c++ - 你能用顶点数组 OpenGL 4.4 做到这一点吗?

C++调用DLL函数