写一些std::string相关的操作

145 阅读1分钟
  • std::string来承接数据(图像数据),利用了string内存在堆上构建的特性
    直接摘录一段将图像数据包装成string,然后从string取出数据的做法
    • 数据包装成string,注意,提前reserve下内存
      主要考察sting::append(char*, size)char*指向的数据保存到string

      void sendBufToRedis(sw::redis::Redis & redis, uint8_t * p_buf, uint64_t buf_size)
        {
                // prepare data  
                std::string str_data;
                str_data.reserve(buf_size);
                uint64_t str_capacity = str_data.capacity();
                printf("str_capacity: %d \n", str_capacity);
                str_data.append((char*)p_buf, buf_size);
                // set  
                redis.set("img", str_data);
        }
      
    • string取数据

      #include <opencv2/opencv.hpp>
      #include <opencv2/highgui/highgui_c.h>
      #include <stdint.h>
      #include <sw/redis++/redis++.h>
      #include <unordered_map>
      #include <unordered_set>
      #include <iostream>
      
      const uint64_t DATA_SIZE{1024*1024*3};
      const uint64_t rows{1464};
      const uint64_t cols{1936};
      const std::string URL{R"(tcp://192.168.0.41:6379)"};
      
      void ctr(cv::Mat& mat_in, std::string& str_data_in)
      {
              if(mat_in.empty())      mat_in.create(rows, cols, CV_8UC1);
              else    mat_in.resize(rows, cols);
      
              memcpy(mat_in.data, str_data_in.c_str(), rows*cols);
      }
      
      int main()
      {
              sw::redis::Redis redis(URL);
      
              // init str_data
              std::string str_data;
              str_data.reserve(DATA_SIZE);
      
              cv::Mat img;
              cv::namedWindow("Wnd", CV_WINDOW_NORMAL);
      
              // while in loop
              while(1)
              {
                      // get from redis-server
                      str_data = *redis.get("img");
                      // convert raw data to mat
                      ctr(img, str_data);
      
                      // show it
                      cv::imshow("Wnd", img);
                      cv::waitKey(10);
      
              }
      
              return 0;
      }