2013-07-10 2 views
0

내 컴퓨터가 64 비트입니다. 내 코드는 아래와 같습니다 :네트워크 가져 오기 경고 5 바이트 왼쪽 시프트 수> = 너비 유형

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

mBuffer는 서명되지 않은 char *입니다. 5 바이트 데이터를 가져와 데이터를 호스트 바이트 순서로 변환하고 싶습니다. 이 경고를 피하려면 어떻게해야합니까?

+0

-1 : 무엇을 시도 했습니까? 경고는 무엇입니까? 쉬프트 된 값의 오버 플로우? –

+0

워닝은 경고합니다 : 왼쪽 쉬프트 카운트> = 너비 타입입니다. 0x00ULL | * (mBuffer + offset) << 32 | * (mBuffer + offset + 1) << 24 | * (mBuffer + offset +2) << 16 | * (mBuffer + offset + 3) << 8 | * (mBuffer + offset + 4); – Ericzhang88120

답변

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 

아마 최고의 바이트 스왑 (비트 이동이 더 빠름) 일 수 있습니다. 그리고 내 논리는 상쇄를 위해 꺼져있을 수도 있지만, 그 선을 따라 무엇인가가 작동해야합니다.

당신이 할 수도있는 다른 일은 데이터 형식을 결정하기 위해 컴파일러에 남겨두고 있기 때문에 이동하기 전에 각 바이트를 캐스팅하는 것입니다 (나는 믿습니다). 그래서 그것을 캐스팅 할 수 있습니다. 더 큰 유형 static_cast<uint64_t>(*(mBuffer + offset)) << 32 또는 뭔가.