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

时间:2015-09-30 12:32:06

标签: 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);
 }

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

  

错误CS0266:无法将类型'int'隐式转换为'byte'。一个   存在显式转换(您是否错过了演员?)

如何将上述功能转换为C#?另外我认为C ++函数可能溢出大部分时间,我会在C#端获得相同的行为吗?

好了,我认为强制转换可能会解决错误 - 但是我会像C ++函数那样使用C#函数获得相同的行为,这主要是由于溢出时可能发生的行为等。

2 个答案:

答案 0 :(得分:2)

问题是你的原始字节在你做的时候被转换成一个整数&#34; 0 - crc&#34;。所以你需要做的就是拥有最后一行

return (byte)(0-crc);

这应该可以解决问题。

它&#34;转换&#34;本身为一个整数,是数值默认为整数。做整数 - 字节=整数

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

所以你需要做的是另外检查

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

答案 1 :(得分:1)

以下是我将如何翻译

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

unchecked将确保溢出不会导致异常。虽然这是默认值,但可以将其更改为编译器选项。

这里的主要区别在于,这不允许您输入与数组的实际长度不匹配的长度。在C ++中,在C#中会有未定义的行为,它会引发异常,因为C#有数组边界检查。

C#和C ++中的溢出是相同的,因为最左边的二进制数字会根据数据类型的大小被截断。