将CRC16计算从C转换为C#
我必须将CRC16计算从C转换为C,但得到的信息是,在将CRC16计算从C转换为C#,c#,c,crc16,C#,C,Crc16,我必须将CRC16计算从C转换为C,但得到的信息是,在(crc&0x8000)和返回(crc&0xFFFF) 迄今为止的守则: 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);
(crc&0x8000)
和返回(crc&0xFFFF)
迄今为止的守则:
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);
}
公共不安全短Crc16(字符串str)
{
短crc=0;
对于(int i=0;i crc=(crc在C中,0
和FALSE
是同义的,任何不是0
的数字都是真的。()
要进行转换,请执行以下操作:
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);
}
}
public short CalcCrc16(字符串str)
{
短crc=0;
int i;
未经检查
{
foreach(str中的字符c)
{
短指数=(crc&0x8000)!=0?0x1021:0;
crc=(crc使用原始C代码会很有帮助,该代码存在多个问题。但是,C#不会隐式地将数值视为布尔值。如果要测试某个值是否为零,则必须专门测试它。对我来说,这看起来像是一个奇怪的crc计算。看起来你没有正确地翻译它。我猜是这样的C参数是“char*”—指向字符串的指针,应该将其转换为“string”,而不是整数类型的“char”。然后“(str+i)*”变成str[i]等。需要原始代码才能获得更明确的答案。我已经更新了我的答案,以反映C代码。感谢您的帮助,但我仍然无法在(crc*(str+I)
上隐式地将类型“int”转换为“short”(crc*(str+I)
与str[I]
相同(不是*str[I]
)@user5825579在C#中,这些操作返回一个int
,因此您需要显式地将其转换为short
。例如,最后一条语句将变成return(short)(crc&0xFFFF)
。与循环中的赋值相同(请注意括号)。
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);
}
}