代码之家  ›  专栏  ›  技术社区  ›  463035818_is_not_an_ai

将数据流式传输到字节数组中

  •  0
  • 463035818_is_not_an_ai  · 技术社区  · 7 年前

    我不得不承认,我现在有点困惑,所以如果问题不是很清楚或者很琐碎,我很抱歉(实际上我希望是后者)。。。。

    size_t max_size = 100;
    uint8_t buffer[size];
    idontknowwhat_t x{buffer};    
    uint16_t size = 11;                 // total number of bytes in the buffer
    uint16_t id_a,id_b,id_c;            // some ids
    uint8_t  a,b,c;                     // some data
    x << size << id_a << a << id_b << b << id_c << c;
    someMethodToSend(buffer,size);
    

    size_t max_size = 100;
    uint8_t buffer[size];
    someMethodToReceive(buffer);
    idontknowwhat_t x{buffer};
    uint16_t size;
    x >> size;
    for (uint16_t i=0; i<size-2; i++) {
        uint16_t id;
        uint8_t data;
        x >> id >> data;
        std::cout << id << " " << data;
    }
    

    所以我的目标基本上是避免丑陋的强制转换和手动增加指针,同时能够 uint8_t uint16_t (也可能是 uint32_t

    有什么可以代替我的假设吗 idontknowwhat_t ?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Kessel    7 年前

    你真的无法避免做丑陋的演员,但至少你可以把他们隐藏在 idontknowwhat_t 班级的 operator>> operator<<

    class idontknowwhat_t
    {
        uint8_t* _data;
    
    public:
        idontknowwhat_t(uint8_t* buffer)
            : _data(buffer)
        {}
    
        template<typename insert_type>
        idontknowwhat_t& operator<<(insert_type value)
        {
            *reinterpret_cast<insert_type*>(_data) = value;
            _data += sizeof(insert_type);
            return *this;
        }
        template<typename extract_type>
        idontknowwhat_t& operator>>(extract_type& value)
        {
            value = *reinterpret_cast<extract_type*>(_data);
            _data += sizeof(extract_type);
            return *this;
        }
    };
    

    我认为这实际上会直接与您的代码一起工作。在本例中 我不知道什么 类不拥有缓冲区,只保留一个原始指针,指向它希望读取或写入的下一位数据。出于实际目的,我建议让

    我不知道什么 班级的责任。有一个 boost library

        2
  •  -1
  •   Michael Thomas    7 年前