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
相关产品推荐
相关产品推荐

