如何在uint8_t *的末尾添加一个int?

时间:2015-06-27 22:32:23

标签: c uint8t

我有一个变量:

uint8_t* data

我想为这些数据添加标题。完全是两个数字。 我想要这样的数据:data + my_int + my_second_int

之后我必须将我的数据提供给一个函数(我无法修改),以及我的数据大小。

像这样:myfunction(data,size);

这是我目前的代码:

struct Data {
  uin8_t* data;
  uint32_t PTS;
  uint32_t DTS;
  uint16_t size_data;
};


struct Data* mydata;
mydata->data = data; // data I get before
mydata->size_daza = size; // size I get before
mydata->PTS = GST_BUFFER_PTS(buf);
mydata->DTS = GST_BUFFER_DTS(buf);

myfunction(mydata,sizeof(struct Data)); // My function , this function add also a header to my data (another).I can't access or modify this function.

在此之后,发生了多件事(并不重要),最后另一个函数删除附加了' myfunction'的标题,然后我在struct Data中投射此函数给出的数据*。我可以访问DTS,PTS,大小,但我对数据有一个SIGSEGV错误。

我想我必须改变我的结构,但我没有看到另一种存储没有指针的缓冲区的方式。

2 个答案:

答案 0 :(得分:0)

这就是结构的用途。您可以定义要发送的数据的结构:

struct Data {
  uint8_t data;
  int first_int;
  int second_int;
  // possibly more
};

并将其传递给发送函数,以指向开头的指针的形式传递给发送函数 占用内存(通常为void *)和相应的大小:

struct Data * mydata = // ... wherever that comes from
send_somewhere(mydata, sizeof(struct Data));
// look at the API doc if you are still the owner of the
// memory and if so, free it (if it's no longer needed and
// has been dynamically allocated)

取决于send_somewhere的实施方式(例如,如果不执行void * send_somewhere((uint8_t*)mydata, sizeof(struct Data)); ),你可能需要施放它, 例如在你描述的情况下:

struct Data {
  // contenst
} __attribute__((__packed__)); // for gcc, and clang

存在一个可能的缺点:结构可能会被优化填充 编译器。填充意味着您要发送的数据超过实际需要发送的数据。根据编译器的不同,还有属性 禁止填充:

@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/add")
public Response putThing(Thing thing) {
    try {
        //Do something with Thing object
        return Response.status(HttpStatus.SC_OK).build();
    } catch (Exception e) {
        log.error("Request failed", e);
        return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
    }
}

答案 1 :(得分:0)

您可能正在使用uint8_t指针访问附加的int值地址。当你正在访问它时,尝试将它转换为int *。

向我们提供您的代码,或者我们只是在猜测。