序列化/反序列化unsigned char

时间:2016-01-05 22:20:44

标签: c++

我正在处理嵌入式设备的API,需要显示(通过API)生成的图像。连接到设备的屏幕允许我渲染位图,数据存储为unsigned char image[] = { 0B00000000, 0B00001111, 0B11111110... }

以任何所需格式反序列化字符串的最简单方法是什么?

我的方法是创建一个stringstream,用逗号分隔并推送到vector<char>。但是,渲染位图的功能只接受char,而我在网上找到的内容似乎很难转换它。理想情况下,我根本不使用vector,因为包含它会为项目增加几个kbs,其大小受嵌入式设备的下载速度限制(固件由EDGE传输)和车载存储。

1 个答案:

答案 0 :(得分:0)

从评论中,听起来你想要转换由一系列&#34; 0b00000000&#34;组成的字符串。样式文字,逗号分隔,成为其实际值的数组。我这样做的方式是:

  1. 获取图像中的字节数(我假设从字符串长度知道这个?)。
  2. 创建std::vector unsigned char来保存结果。
  3. 对于输入中的每个字节,从字符串值构造std::bitset,然后获取其实际值。
  4. 这是一个代码示例。既然你说过你不使用vector我使用了C风格的数组和字符串:

    #include <bitset>
    #include <cstring>
    #include <iostream>
    #include <memory>
    
    int main() {
        auto input = "0b00000000,0b00001111,0b11111111";
        auto length = strlen(input);
    
        // Get the number of bytes from the string length. Each byte takes 10 chars
        // plus a comma separator.
        int size = (length + 1) / 11;
    
        // Allocate memory to hold the result.
        std::unique_ptr<unsigned char[]> bytes(new unsigned char[size]);
    
        // Populate each byte individually.
        for (int i = 0; i < size; ++i) {
            // Create the bitset. The stride is 11, and skip the first 2 characters
            // to skip the 0b prefix.
            std::bitset<8> bitset(input + 2 + i * 11, 8);
    
            // Store the resulting byte.
            bytes[i] = bitset.to_ulong();
        }
    
        // Now loop back over each byte, and output it to confirm the result.
        for (int i = 0; i < size; ++i) {
            std::cout << "0b" << std::bitset<8>(bytes[i]) << std::endl;
        }
    }