- 最近接触项目,遇到了一个char型数组的类型转换问题,需求为变为uint8_t。
- 在函数调用中,由于取char型数组的首地址,则设定了实参const char * bufData
,但是在函数定义中,使用到的为uint_8t * bufData的形参。 - 由于buff中的数值在传过来后并不是char型数组,所以在代入CRC校验后,计算出错。
uint16_t factory_crc16 ( uint8_t *bufData, uint16_t buflen)
{
uint16_t CRC_check = 0xffff;
uint16_t POLYNOMIAL = 0xa001;
uint8_t i, j;
for (i = 0; i < buflen; i++)
{
TCPCRC ^= bufData[i];
for (j = 0; j < 8; j++)
{
if ((CRC_check & 0x0001) != 0)
{
CRC_check >>= 1;
CRC_check ^= POLYNOMIAL;
}
else
{
CRC_check >>= 1;
}
}
}
return CRC_check;
}
因此,涉及到一个核心问题,能否将函数调用时在进行强制类型转换,将char * 指针转换为uint8_t *型指针。
经过测试,char * 指针转化成 uint8_t * 是可行的。即使用时为:
uint16_t Check_CRC = factory_crc16 ((uint8_t *)data, 8);
可以转换的原理为:传入的字符本就是8位的,仅变了是否读取符号位而已。在首字节地址不变的情况下,可获得需要的信息。
但需要注意的是,如果存入的是整形数组,但强制类型转换浮点型,则会数据出错,所以一般不要进行整形转浮点型或浮点型转整形的骚操作。
其他应用:
通过指针类型的强制转换,我们可以对多个字节的数据类型分别进行单字节和整体的操作,再对数据的变换(编码算法,密码算法等)中可以得到很多运用,提高效率。
比如说:
unsigned char arrayA[4] = {0x11, 0x11, 0x11, 0x11};
unsigned char arrayB[4] = {0x00, 0x11, 0x00, 0x11};
我们想对这两个数组进行异或操作, 结果保存在arrayA中,就不必一个字节一个字节去操作了,而使用下面的写法:
*(unsigned long int*)arrayA = *(unsigned long int*)arrayA ^ *(unsigned long int*)arrayB;