Моя машина 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-байтовые данные и преобразовать данные в порядок байтов хоста.
Как я могу избежать этого предупреждения?
Иногда лучше разбить на несколько строк, чтобы избежать проблем. У вас есть 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
или что-то.
Других решений пока нет …