获取网络5字节警告左移计数> =类型宽度

时间:2013-07-10 02:19:14

标签: c++ unsigned-long-long-int

我的机器是64位。我的代码如下:

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

mBuffer是unsigned char *。我想获得5个字节的数据并将数据转换为主机字节顺序。 我该如何避免这种警告?

1 个答案:

答案 0 :(得分: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或其他类型。