2014-10-04 3 views
1

파일에서 10 바이트를 읽어야하고 마지막 4 바이트는 부호없는 정수입니다. 하지만 11 char 바이트 긴 char 배열/포인터가 있어요. 마지막 4 바이트 (끝의 0 문자 제외)를 부호없는 정수로 변환하려면 어떻게해야합니까?C에서 int 4 chars까지

//pesudo code 
char *p = readBytesFromFile(); 
unsigned int myInt = 0; 
for(int i = 6; i < 10; i++) 
    myInt += (int)p[i]; 

맞습니까? 나에게 맞는 것 같지 않습니다.

+1

'* (int *) (p + 6)'를 시도하십시오. – Athari

+1

'memcpy'를 사용하십시오. '* (int *) (p + 6)'(1)은 정렬 문제를 일으킬 수 있고 (2) 엄격한 앨리어싱을 위반할 수 있습니다. 엔디 언니스도 문제가 될 수 있습니다. –

+3

기본적으로 다른 바이트의 비트를 적절한 위치로 이동해야합니다. 전송 된 값의 endianess에 따라 다름. 루프의 할당은 'myInt = myInt << 8 | static_cast <부호없는 문자> (p [i])'. 또는 루프를 역순으로 반복 할 수도 있습니다. –

답변

2

다음 코드 일 :

myInt = *(reinterpret_cast<unsigned int*>(p + 6)); 

IFF :

  • 는 GPU의 메모리 공간에 예 (정렬에 문제가 없습니다 일부 보증이 제공되지 않는 경우 이는 매우 위험합니다.)
  • 당신은 Dietmar 제안, 당신이해야, 시스템 엔디안 당신은 sizeof(int) == 4, 이것은는

그렇지 않으면 모든 곳에서 보장되지 것을 확신 할 수

  • 데이터를 저장하는 데 사용되는 동일하다고 보장 할 수 데이터 돌이이 정렬 - 안전 (앞으로 또는 반전 엔디안에 따라) 및

    myInt = myInt << 8 | static_cast<unsigned char>(p[i]) 
    

    처럼 뭔가를 (이것은 모든 시스템에 있어야합니다). 점 1과 3에주의를 기울이십시오.

  • +0

    엄격한 앨리어싱. unsigned int 유형의 glvalue를 통해 chars 묶음의 저장된 값에 액세스 할 수 없습니다. –

    +0

    그것을하지 않는 또 다른 이유. –

    1

    시도 myInt = *(reinterpret_cast<unsigned int*>(p + 6));.

    6 번째 문자의 주소를 사용하여 부호없는 int에 대한 포인터로 재 해석 한 다음 가리키는 (부호없는 int) 값을 반환합니다.

    +0

    endianness –

    +0

    과 관련하여 위험 할 수 있습니다. 왜 포인터로 만드나요? – Davlog

    +0

    보면'unsigned int' 변수가 없기 때문입니다. 우리는 포인터가 필요한 임의의 메모리를보고 있습니다. 'reinterpret_cast'는 그 이유 때문에 포인터에서만 작동합니다. –

    2

    이전 답변에 동의하지만 파일이 다른 엔디 언으로 작성된 경우이 솔루션이 100 % 작동하지 않을 수 있음을 추가하고 싶습니다.

    나는 당신에게 추가 정보를 혼동하고 싶지 않지만 파일에서 직접 전송할 때 엔디 언 현상이 발생할 수 있음을 명심하십시오. 여기

    엔디안에 대한 자습서의 : http://www.codeproject.com/Articles/4804/Basic-concepts-on-Endianness

    관련 문제