我正在尝试从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#函数获得相同的行为,这主要是由于溢出时可能发生的行为等。
答案 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 ++中的溢出是相同的,因为最左边的二进制数字会根据数据类型的大小被截断。