C/C++ 变量指针的强制类型转换

  • 最近接触项目,遇到了一个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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RobotWoods

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值