【问题标题】:How to copy data into certain parts of a byte array如何将数据复制到字节数组的某些部分
【发布时间】:2017-12-01 22:21:24
【问题描述】:

我想用一个未知的结构创建一个字节数组,并在这个字节数组的前面额外添加一个数字。我该怎么做?

我目前有这个代码:

template <class T>
void CopterConnection::infoToByteArray(char *&bit_data, size_t *msglen,
                                       T data) {
    // Determine which kind of element is in the array, will change in the final code
    char typeID = -1;

    *msglen = sizeof(data);
    *msglen += 1;  // take in account of typeID

    // Create the pointer to the byte representation of the struct
    bit_data = new char[*msglen];

    // copy the information from the struct into the byte array
    memcpy(bit_data, &data+1, *msglen-1);
    bit_data[1] = typeID;
}

但这不起作用。我想我使用 memcpy 错误。我想将未知结构 T 复制到位置 bit_data[1]bit_data[*end*]。实现这一目标的最佳方法是什么?

【问题讨论】:

  • 不工作 没有任何意义。请准确说出发生了什么...
  • 现在你修复了你的代码,它“工作”了吗?
  • 如果您更新了问题中的代码以包含来自答案的修复,那么请不要这样做!它使答案变得无用,问题更是如此。
  • 它现在可以工作了,这是一些简单的错误,但感谢您帮助我找到它们。我更新了这个问题,因为我认为它们不会是问题的原因,而只是轻率。
  • 对于任何想要解决问题的人来说,现在这不是一个非常有用的问题。

标签: c++ arrays bit memcpy


【解决方案1】:

一个可能的问题和一个确定的问题:

  1. 可能的问题是数组索引从零开始。所以你应该复制到bit_data + 1跳过第一个字节,然后当然使用bit_data[0]设置类型id。

  2. 确定的问题是&amp;data + 1 等于(&amp;data)[1],这将超出范围并导致未定义的行为。你应该从&amp;data复制过来。

将它们放在一起最后一行应该是

memcpy(bit_data + 1, &data, *msglen-1);
bit_data[0] = typeID;

还有另一个可能的问题,这取决于你对bit_data 中的数据做了什么,以及T 是什么。如果T 不是POD type,那么您根本无法期望按位复制(memcpy 所做的)工作得很好。

此外,如果T 是一个类或结构,其成员是指针,那么您无法将它们保存到磁盘或传输到另一台计算机,甚至是同一台计算机上的另一个进程。

【讨论】:

    【解决方案2】:

    除了你正在搞乱新的事实之外,还有一些错误。

    memcpy 行本身您使用&amp;data + 1 作为源,这里将是未定义的行为。它将 sizeof(data) 字节添加到地址中,该地址被复制到堆栈中的某个位置,而“末尾的一个”是一个有效的指针,因此该地址在指针算术中是有效的,您从中读取的任何内容都不会,也没有任何内容之后。

    bit_data[1] 是缓冲区中的第二个字符。

    【讨论】:

    • 我很抱歉
    猜你喜欢
    • 2015-02-05
    • 2016-05-11
    • 2019-07-22
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多