【问题标题】:Append different types of data to a vector of bytes将不同类型的数据附加到字节向量
【发布时间】:2021-01-19 11:48:01
【问题描述】:

我有一个字节向量,我想向它存储不同类型的数据。我已将该向量定义为 packed_data,您可以在我的类的以下成员函数中看到它。

现在我想用 PackedData 成员函数获取不同类型的数据,然后将这些信息作为字节附加到 raw_data 向量中。

// Here I initialize a single vector with the vectors value

std::vector<BYTE> PackedData()
{
    std::vector<BYTE> packed_data;

    // Here I have initialized the header with two byte
    packed_data.insert(packed_data.end(), m_header.begin(), m_header.end());

    // I specified encoding of the packet
    packed_data.insert(packed_data.end(), m_messageEncoding);

    // I specified message type
    packed_data.insert(packed_data.end(), m_messageType);

    // I specified size of payload should send to the server
    packed_data.insert(packed_data.end(), m_messageSize);

    // I specified payload itself must send to the server
    packed_data.insert(packed_data.end(), m_payload.begin(), m_payload.end());

    // I specified footer 
    packed_data.insert(packed_data.end(), m_footer.begin(), m_footer.end());

    return packed_data;
}

将向量添加到 packed_data 没有任何问题,但是当我想将消息的大小(它具有 unsigned int 数据类型)作为 4 字节实体存储到字节向量中时,我无法正确来自向量的数据。

例如,当我将 512(十进制值)作为 m_messageSize(无符号整数)的输入传递时,它只会将一个字节附加到 packed_data 向量(例如 0x20)。

在下一节中,您还可以看到我的类的构造函数,我将在那里初始化我的成员字段:

CRawData(MessageType arg_message_type, MessageEncoding arg_encoding, unsigned int arg_total_size, std::vector<BYTE> arg_payload)
{
    // Header Initialization
    m_header.push_back(0xAA);
    m_header.push_back(0xAA);
    
    // Send / Request / Verification Specifier
    m_messageType = arg_message_type;
    
    // Encoding Specifier
    m_messageEncoding = arg_encoding;
    
    // Number of chunks should sent
    m_messageSize = arg_total_size;
    
    // Payload initialization
    m_payload = arg_payload;
    
    // Footer specifier
    m_footer.push_back(0xFF);
    

m_footer.push_back(0xFF);
}

确实,我想将 00 00 20 00 之类的内容附加到我的向量中。我该如何管理这个目标?如果您需要更多信息,请在评论中请求我可以以正确的方式编辑我的问题。

【问题讨论】:

    标签: c++ vector


    【解决方案1】:

    如果BYTEcharsigned charunsigned charstd::byte的别名,则可以将reinterpret_cast指向对象的指针指向BYTE的指针,并使用InputIt重载vector::insert.

    仅当您的所有数据都是 trivial types 时才有意义。

    std::vector<BYTE> PackedData()
    {
        std::vector<BYTE> packed_data;
    
        // Here I have initialized the header with two byte
        packed_data.insert(packed_data.end(), m_header.begin(), m_header.end());
    
        // I specified encoding of the packet
        packed_data.insert(packed_data.end(), reinterpret_cast<BYTE*>(&m_messageEncoding), reinterpret_cast<BYTE*>(&m_messageEncoding + 1));
    
        // I specified message type
        packed_data.insert(packed_data.end(), reinterpret_cast<BYTE*>(&m_messageType), reinterpret_cast<BYTE*>(&m_messageType + 1));
    
        // I specified size of payload should send to the server
        packed_data.insert(packed_data.end(), reinterpret_cast<BYTE*>(&m_messageSize), reinterpret_cast<BYTE*>(&m_messageSize + 1));
    
        // I specified payload itself must send to the server
        packed_data.insert(packed_data.end(), m_payload.begin(), m_payload.end());
    
        // I specified footer 
        packed_data.insert(packed_data.end(), m_footer.begin(), m_footer.end());
    
        return packed_data;
    }
    

    【讨论】:

      【解决方案2】:

      您还需要将unsinged int 视为一个字节数组,否则它会转换 为单个字节并且其余数据会丢失。所以像:

      BYTE* msgType_begin = reinterpret_cast<BYTE*>(&m_messageType);
      packed_data.insert(packed_data.end(), msgType_begin, msgType_begin + sizeof(m_messageType));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-23
        • 2015-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-20
        • 2016-05-20
        相关资源
        最近更新 更多