Как преобразовать 4-байтовую «строку» в uint32_t? - PullRequest
1 голос
/ 19 февраля 2012

По сути, у меня есть строка байтов данных, например: \x00\x00\x00\x00 \x08\x00\x00\x00 \x05\x00\x00\x00 (пробелы используются только для видимости, в реальной строке байтов нет пробелов). Данные имеют порядок байтов.

Теперь мне нужно извлечь вторую 4-байтовую группу (\x08\x00\x00\x00, то есть 128) и превратить их в длинную без знака. Итак, uint32_t тип.

По сути, я делаю: moveBlock(&gdata->str[4], &second_group, 4);

Где moveBlock - это макрос: #define moveBlock(src,dest,size) memmove(dest,src,size). Я использую макрос, потому что лично я предпочитаю этот порядок параметров, если кому-то интересно.

gdata->str - указатель на gchar * ( ссылка здесь ) и gdata это GString * ( ссылка здесь ). second_group определяется как uint32_t.

Итак, это работает иногда , но не всегда. Честно говоря, я не знаю, что я делаю неправильно!

Спасибо!


P.S .: Код немного длинен и странен, и я не думаю, что прохождение всего этого было бы уместно. Если кто-то не попросит об этом, я не буду излишне загромождать вопрос

Ответы [ 3 ]

5 голосов
/ 19 февраля 2012

Вот чистая портативная версия:

unsigned char *p = (void *)data_source;
uint32_t x = p[0] + 256U*p[1] + 65536U*p[2] + 16777216U*p[3];
1 голос
/ 19 февраля 2012

Вы можете попробовать strtoul()

Изменить: вам придется завершить массив массивом, чтобы сделать его строкой

0 голосов
/ 08 августа 2017

"строка" на самом деле в старшем порядке.

тогда вам нужно be32toh или напишите это себе так:

uint32_t conver(const void *src){
   const char *s = src;
   const char out[] = { s[3],s[2],s[1], s[0] };
   return (uint32_t) out;
}

Примечание: я не пробовал код, могут быть ошибки, но вы поняли

...