将 CRC16 计算从 C 转换为 C#
Converting CRC16 calculation from C to C#
我必须将 CRC16 计算从 C 转换为 C#,但得到的消息是我无法在 (crc & 0x8000)
和 [=13= 上将类型 'int' 隐式转换为 'bool' ]
目前的代码:
public unsafe short Crc16(string str)
{
short crc = 0;
for(int i = 0; i < str.Length; i++)
{
crc = (crc << 1) ^ str[i] ^ ((crc & 0x8000) ? 0x1021 : 0);
}
return (crc & 0xFFFF);
}
编辑:将 char 参数更改为字符串
原始C代码
short Crc16( char *str )
{
short crc=0;
unsigned int i;
for (i=0; i<strlen(str); i++)
crc = (crc << 1) ^ *(str+i) ^ ((crc & 0x8000)? 0x1021:0 );
return (crc & 0xffff);
}
在C中,0
和FALSE
是同义词,任何不是0
的数都是真的。 (reference)
要进行转换,您可以这样做:
public short CalcCrc16(string str)
{
short crc = 0;
int i;
unchecked
{
foreach(char c in str)
{
short exponent = (crc & 0x8000) != 0 ? 0x1021 : 0;
crc = (crc << 1) ^ ((short)c) ^ exponent);
}
return (short)(crc & 0xFFFF);
}
}
现在我们有了要使用的 C 代码,我更改了此处的代码示例以匹配。以下是对变化的解释:
char*
是字符串 的 C 等价物
for
循环遍历字符*(str + i)
可以重写为str[i]
,相当于C#的str.GetChar(i)
- 三元条件判断指数是0x1021还是0
- 我把这些线分开了,这样你可以更清楚地看到算法。
- 我把字符上的
for(int i = 0; i < str.Length; i++)
改成了foreach
,因为这样更容易理解。
我必须将 CRC16 计算从 C 转换为 C#,但得到的消息是我无法在 (crc & 0x8000)
和 [=13= 上将类型 'int' 隐式转换为 'bool' ]
目前的代码:
public unsafe short Crc16(string str)
{
short crc = 0;
for(int i = 0; i < str.Length; i++)
{
crc = (crc << 1) ^ str[i] ^ ((crc & 0x8000) ? 0x1021 : 0);
}
return (crc & 0xFFFF);
}
编辑:将 char 参数更改为字符串
原始C代码
short Crc16( char *str )
{
short crc=0;
unsigned int i;
for (i=0; i<strlen(str); i++)
crc = (crc << 1) ^ *(str+i) ^ ((crc & 0x8000)? 0x1021:0 );
return (crc & 0xffff);
}
在C中,0
和FALSE
是同义词,任何不是0
的数都是真的。 (reference)
要进行转换,您可以这样做:
public short CalcCrc16(string str)
{
short crc = 0;
int i;
unchecked
{
foreach(char c in str)
{
short exponent = (crc & 0x8000) != 0 ? 0x1021 : 0;
crc = (crc << 1) ^ ((short)c) ^ exponent);
}
return (short)(crc & 0xFFFF);
}
}
现在我们有了要使用的 C 代码,我更改了此处的代码示例以匹配。以下是对变化的解释:
char*
是字符串 的 C 等价物
for
循环遍历字符*(str + i)
可以重写为str[i]
,相当于C#的str.GetChar(i)
- 三元条件判断指数是0x1021还是0
- 我把这些线分开了,这样你可以更清楚地看到算法。
- 我把字符上的
for(int i = 0; i < str.Length; i++)
改成了foreach
,因为这样更容易理解。