Memcpy uint32_t в символ *

Я немного протестировал разные форматы и тому подобное. И у нас есть задача, где мы должны поместить uint32_t в char *. Это код, который я использую:

void appendString(string *s, uint32_t append){
char data[4];
memcpy(data, &append, sizeof(append));
s->append(data);
}

void appendString(string *s, short append){
char data[2];
memcpy(data, &append, sizeof(append));
s->append(data);
}

От строки к символу просто, и мы должны добавить несколько символов в символ *. Так что теперь я просто называю это так:

string s;
appendString(&s, (uint32_t)1152); //this works
appendString(&s, (uint32_t)640); //this also works
appendString(&s, (uint32_t)512); //this doesn't work

Я абсолютно не понимаю, почему последний не работает должным образом. Я протестировал несколько вариантов преобразования этого. Один способ всегда дал мне вывод, как (в битах): 00110100 | 00110101 … так что первые 2 бита всегда равны нулю, затем 11, а затем для меня несколько случайных чисел .. Что я делаю не так?

0

Решение

При условии, что string является std::stringто версия с одним аргументом std::string::append используется, что предполагает, что входные данные заканчиваются NUL. Твой нет, но append все равно буду искать первый NUL-байт.

512 это 0x00000100, что на машине с прямым порядком байтов 0x00 0x01 0x00 0x00. Поскольку первый байт равен NUL, std::string::append() останавливается там

Используйте версию std::string::append() где вы проходите в длину.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]