渐行渐远是否还有一种坚持留在心间 2018-07-24 04:30 采纳率: 100%
浏览 3877
已采纳

C++ unsigned char* 转 int*,操作符重载,隐式类型转换

unsigned char * data;
data是内存连续的数组,size很长,需要转换成 int * ints;
其中 每三个char组合一个int
比如

ints[0] = (data[0]<< 16) | (data[1]<< 8 ) | data[2] ;

我不希望用for循环遍历算出来,以及频繁的内存拷贝操作,效率太低

下面是我没走通的路子:

typedef struct int24 {
    uchar r, g, b;
    operator int() {
            return b | (g << 8) | (r << 16);
    }
}

unsigned char * data = ...
int24 * tmp = (int24 * ) data;
int *  ints = (int * ) tmp;

使用int * ints = (int * ) tmp毫无意义,还是指针转换,没能应用到重载操作符类型转换

最终结果是得到int * ,是否有别的方法?望指教。

  • 写回答

4条回答

  • AlbertS 博客专家认证 2018-07-25 02:55
    关注
     typedef struct int24 {
        unsigned char start;
    
        const int operator[](int index) const 
        {
            const unsigned char* pStart = &start;
            return pStart[2 + index * 3] | (pStart[1 + index * 3] << 8) | (pStart[0 + index * 3] << 16);
        }
    }int24;
    
    int main(int argc, char* argv[])
    {
        unsigned char data[1024] = {0,1,1, 0,0,1, 0,1,0, 0};
        int24* tmp = (int24 *) data;
        int24& int24Object = *tmp;
    
        printf("front three num %d, %d, %d", int24Object[0], int24Object[1], int24Object[2]);
    
        return 0;
    }
    
    

    也可以这样,输出结果为:front three num 257, 1, 256

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体