Получите 5-байтовое предупреждение о левом смещении в сети & gt; = ширина типа

Моя машина 64 битная. Мой код, как показано ниже:

unsigned long long periodpackcount=*(mBuffer+offset)<<32|*(mBuffer+offset+1)<<24|*     (mBuffer+offset+2)<<16|*(mBuffer+offset+3)<<8|*(mBuffer+offset+4);

mBuffer — это неподписанный символ *. Я хочу получить 5-байтовые данные и преобразовать данные в порядок байтов хоста.
Как я могу избежать этого предупреждения?

0

Решение

Иногда лучше разбить на несколько строк, чтобы избежать проблем. У вас есть 5-байтовое целое число, которое вы хотите прочитать.

// Create the number to read into.
uint64_t number = 0;  // uint64_t is in <stdint>
char *ptr = (char *)&number;

// Copy from the buffer. Plus 3 for leading 0 bits.
memcpy(ptr + 3, mBuffer + offset, 5);

// Reverse the byte order.
std::reverse(ptr, ptr + 8);  // Can bit shift here instead

Вероятно, не самый лучший обмен байтов (сдвиг битов происходит быстрее). И моя логика может быть отключена для смещения, но что-то в этом роде должно работать.

Другая вещь, которую вы можете захотеть сделать, это привести каждый байт перед сдвигом, так как вы оставляете его на усмотрение компилятора для определения типа данных. *(mBuffer + offset) это персонаж (я считаю), поэтому вы можете привести его к более крупному типу static_cast<uint64_t>(*(mBuffer + offset)) << 32 или что-то.

0

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

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

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