You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CRC-16 CCITT-FALSE校验和计算结果不符,请求排查问题

CRC-16 CCITT-FALSE计算结果错误排查

问题描述

我编写了符合CRC-16 CCITT-FALSE规范的C语言函数:

uint16_t crc16(const char* pData, int length)
{
    uint8_t i;
    uint16_t wCrc = 0xffff;
    while (length--) {
        wCrc ^= *(unsigned char *)pData++ << 8;
        for (i=0; i < 8; i++)
            wCrc = wCrc & 0x8000 ? (wCrc << 1) ^ 0x1021 : wCrc << 1;
    }
    return wCrc & 0xffff;
}

在Objective-C应用中的调用代码如下:

- (IBAction)mycrc16function:(id)sender
{
NSString * stringexample = @"Example";

const char * stringAsChar = [stringexample cStringUsingEncoding:[NSString defaultCStringEncoding]]; //encode string into c string encoding

unsigned long CrcTest = crc16(stringAsChar,sizeof(stringAsChar)); // put encoded string date and size of string into the crc16 function.

NSLog(@"crctext %04lX\n",CrcTest); // print outcome to log
    
}

计算字符串“Example”的校验和时得到结果6B20,但正确结果应为E272,请问我哪里出错了?

错误原因及修正方案

1. 字符串长度计算错误

sizeof(stringAsChar)获取的是指针的内存大小(64位系统下为8字节),而非字符串的实际字节长度。正确做法是用strlen(stringAsChar)获取字符串的有效长度。

2. 编码方式不明确

[NSString defaultCStringEncoding]依赖系统默认编码,不同环境下可能导致编码差异,建议明确指定UTF-8编码(NSUTF8StringEncoding),保证与校验工具使用的编码一致。

3. 类型匹配优化

crc16返回uint16_t类型,用unsigned long接收虽不会报错,但输出时用%04X配合强制转换为unsigned int更严谨,避免格式匹配问题。

修正后的调用代码

- (IBAction)mycrc16function:(id)sender
{
    NSString *stringexample = @"Example";
    const char *stringAsChar = [stringexample cStringUsingEncoding:NSUTF8StringEncoding];
    size_t strLength = strlen(stringAsChar);
    uint16_t CrcTest = crc16(stringAsChar, (int)strLength);
    NSLog(@"crctext %04X\n", (unsigned int)CrcTest);
}

内容的提问来源于stack exchange,提问作者BestKrucader

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 01:01:09