gpt4 book ai didi

c# - 将 C 语言的 CRC16 代码移植到 C# .NET

转载 作者:太空宇宙 更新时间:2023-11-04 05:57:28 25 4
gpt4 key购买 nike

所以我有需要移植到 C# 的 C 代码:

C 代码:

uint16 crc16_calc(volatile uint8* bytes, uint32 length)
{
uint32 i;
uint32 j;
uint16 crc = 0xFFFF;
uint16 word;

for (i=0; i < length/2 ; i++)
{
word = ((uint16*)bytes)[i];

// upper byte
j = (uint8)((word ^ crc) >> 8);
crc = (crc << 8) ^ crc16_table[j];

// lower byte
j = (uint8)((word ^ (crc >> 8)) & 0x00FF);
crc = (crc << 8) ^ crc16_table[j];
}
return crc;
}

移植的 C# 代码:

public ushort CalculateChecksum(byte[] bytes)
{
uint j = 0;
ushort crc = 0xFFFF;
ushort word;

for (uint i = 0; i < bytes.Length / 2; i++)
{
word = bytes[i];

// Upper byte
j = (byte)((word ^ crc) >> 8);
crc = (ushort)((crc << 8) ^ crc16_table[j]);

// Lower byte
j = (byte)((word ^ (crc >> 8)) & 0x00FF);
crc = (ushort)((crc << 8) ^ crc16_table[j]);
}

return crc;
}

此 C 算法使用查找表 crc16_table[j] 计算所提供字节的 CRC16

但是移植的 C# 代码不会产生与 C 代码相同的结果,我做错了什么吗?

最佳答案

word = ((uint16*)bytes)[i];

bytes 中读取两个字节到 uint16 中,而

word = bytes[i];

只读取一个字节。

假设您在小端机器上运行,您的 C# 代码可能会更改为

word  = bytes[i++];
word += bytes[i] << 8;

或者,可能更好,如 MerickOWA 所建议的那样

word = BitConverter.ToInt16(bytes, i++);

请注意,您可以通过更改循环来避免 i 看起来奇怪的额外增量:

for (uint i = 0; i < bytes.Length; i+=2)
{
word = BitConverter.ToInt16(bytes, i);

关于c# - 将 C 语言的 CRC16 代码移植到 C# .NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24687565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com