2011-02-17 1 views
2

나는 아마도 여기에서 매우 틀렸을 것이다. 그래서 내가 가지고있는 오해 나 실수를 지적 해주십시오.4 바이트 부호없는 정수 리틀 엔디안 형식을 사용하여 정수를 얻습니까? (C++)

이 할당에 대한 입력은 리틀 엔디안 형식의 일련의 4 바이트 부호없는 정수가 뒤 따르는 일부 문자의 문자열입니다. 입력을 STL 문자열로 읽은 다음 하위 문자열 함수를 사용하여 정수 만 새 문자열로 분리했습니다.

내가 이해 한대로, 최하위 비트는 왼쪽 바이트부터 시작하여 저장됩니다. 이진 표현이 (0000 0000 0000 0001 1111 1111 1111 1111) 인 부호없는 정수 131071 (dec)은 다음과 같이 저장됩니다. 1111 1111 1111 1111 0000 0001 0000 0000

이 새 문자열을 한 번에 4 바이트 구문 분석 할 때 생각했습니다. 첫 번째 바이트는 0-255의 값을위한 비트를 포함하고, 두 번째 바이트는 256-65535를위한 것이고, 세 번째와 네 번째 바이트를위한 것입니다.

첫 번째 바이트를 가져 와서 부호없는 int로 형 변환 한 다음 24 비트를 시프트했습니다. 16 비트 및 8 비트 시프트를 제외하고는 2 번째 및 3 번째 바이트와 동일하게 수행했습니다.

예상대로 첫 번째 및 두 번째 바이트는 255 및 65535이지만 세 번째 바이트는 0입니다. 나는 어딘가에서 & 연산자를 사용해야한다고 믿지만, 나는 어디에서인지 알 수 없다. 누군가 나에게 조언을하거나, 어쩌면 같은 일을 성취하기위한 어리석은 방법을 줄 수 있다면, 나는 크게 감사 할 것입니다.

+1

내가 잘못 생각한 부분을 해결하려면 코드가 필요하다고 생각합니다. – jcoder

+0

"가장 왼쪽 바이트"는 다소 모호합니다. 필자가 마이크로 아키텍처에 대해 읽은 매뉴얼에서 주소는 항상 왼쪽으로 증가합니다. 즉, 가장 왼쪽 바이트는 가장 높은 주소를 갖는 바이트입니다. 그러나 나는 당신이 "가장 낮은 주소"를 의미하는 것으로 가장 왼쪽으로 간다고 가정합니다. (일반적으로 나는 이것에 대해 솔직하지 않다. 그러나 왼쪽과 오른쪽은 엔디안에 대해 이야기 할 때 약간 중요하다.) –

+0

1111 1111 1111 1111 ** 0001 0000 ** 0000 0000으로 저장 될 것이다. 아마도 오타 일 것이다. – Lundin

답변

3

3 바이트가 0이고 데이터가 설명과 일치하면 코드에 버그가 있습니다. 아래 코드는 샘플 데이터를 올바르게 변환합니다.

// Data from file 
unsigned char Buffer[] = { 255, 255, 1, 0 }; 

// Convert the LSB data to an unsigned int 
unsigned int Result = 0; 
for (int i = 0; i < 4; ++i) { 
    Result |= static_cast<unsigned int>(Buffer[i]) << (i*8); 
} 
관련 문제