2015-06-27 3 views
1

У меня есть переменная:Как добавить int в конец uint8_t *?

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 в данных.

Я думаю, что мне нужно изменить свою структуру, но я не вижу другого способа хранения буфера без указателя.

+0

Определить структуру? –

+0

Да, это возможность, но я хочу отправить свои данные в UDP. –

+0

... так? Отправка обычно выполняется с использованием указателя и размера: 'sizeof (struct mystruct)' –

ответ

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)); 

Существует возможный недостаток: Структуры могут получить Дополняется оптимизирующий компилятор . Заполнение означает, что вы отправляете больше данных, чем вам действительно нужно отправить. В зависимости от компилятора есть атрибуты для DISALLOW дополнения:

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

Спасибо, но когда функция будет читать mydata, это будет просто таблица? Поскольку эта функция принимает только буферы. –

+0

Да, функция видит начало некоторой памяти плюс ее размер и не знает, что содержится внутри этой памяти. –

+0

Ничего себе это большое спасибо. Я проверю это;) –

0

Вы, вероятно, обращающиеся прилагаемую адрес INT значения с указателем uint8_t. Попробуйте применить его к int * при обращении к ним.

Дайте нам свой код, мы просто угадываем.

+2

Нет. У этого есть проблемы с выравниванием. – imallett

+0

@imallett: ... ** возможно ** имеет проблему выравнивания s в зависимости от количества 'uint8_t', помещенного перед двумя' int '. – alk

Смежные вопросы