2012-12-18 2 views
0

가능한 중복 값 :
Store an int in a char array?로드/스토어

전 32 비트 정수 4 내지 8 비트의 부호없는 문자를로드 할

. 그리고 부호없는 char 포인터에 32 비트 정수를 저장하십시오. 어떻게 가능합니까? 아래 예제 사용; 바이트를 가정

int 32bitint1= 0xff000000 | (uchar1<<16) | (uchar2<<8) | uchar3; 
int 32bitint2= 0xff000000 | (uchar4<<16) | (uchar5<<8) | uchar6; 
//then this 32-bit integer to uchar pointer; 
ucharpointer[0] = 32bitint1; 
ucharpointer[4] = 32bitint2;//is this possible?or how 
+0

왜 char 배열을 char 배열에 직접 할당하지 않을까요? – Mat

+4

당신이하려는 일과 왜 그 일을하려고하는지에 대해 더 정확하게 말할 수 있습니까? –

+2

'32bitint1'과 같은 변수 이름에는 어떤 컴파일러에 문제가 없습니까? –

답변

1

스토어 : (부호없는 int에 4 개의 문자를 저장)

int store(uint32_t * reg, unsigned char c[4]) 
{ 
    *reg = 0; 
     for(int i=0;i<4;i++) 
     { 
      *reg = (*reg<<8) | c[i]; 
     } 
     return 0; 
} 

로드 : (부호없는 INT 4 개 문자로드)

int load(uint32_t * reg, unsigned char c[4]) 
{ 
     for(int i=0;i<4;i++) 
     { 
      c[i] = *reg; 
      *reg = *reg>>8; 
     } 
     return 0; 
} 

사용 예 :

int main() 
{ 
    unsigned char c[4] = {'a','b','c','d'}; 
    uint32_t reg; 

    printf("%c",c[0]); //it prints 'a' 
    store(&reg,c); 

    c[0] = 'e'; 
    printf("%c",c[0]); //it prints 'e' 

    load(&reg,c);  //load 
    printf("%c",c[0]); //it prints 'a' again 

    return 0; 
} 

당신이 char 배열로 다시로드하지 않으려면, char 포인터로 액세스하려면 예 :

int main (int argc, char const *argv[]) 
{ 
    unsigned char c[4] = {'a','b','c','d'}; 
    uint32_t reg; 
    store(&reg,c); 

    unsigned char *cpointer = (unsigned char *) &reg; 

    for(int i=0;i<4;i++) 
    { 
     printf("%c",cpointer[i]); //access the 4 chars by a char pointer 
    } 
    return 0; 
} 

메모리 주소가 역순으로 만들어 지므로이 방법으로 'dcba'가 출력됩니다.

+0

보증되지 않는 int == 4 바이트 –

+0

@DavidRF 감사합니다! 나는 그들을'uint32_t'로 대체했습니다. – Skyler

+0

당신을 환영합니다;) –

0

는 부호없는 문자 포인터

uint32_t bit_32 = ((uint32_t)uchar[0] << 24) | ((uint32_t)uchar[1] << 16) | ((uint32_t)uchar[2] << 8) | ((uint32_t)uchar[3]) 

저장소 32 비트 정수로서 각각 4 바이트 형성하는 32 바이트를 저장, 빅 엔디안을 판독

unsigned char *ptr = &bit_32; 
+0

8 비트 변수를 7 번 이상 왼쪽으로 이동하면 0이됩니다. uchar 변수는이 작업을 수행하려면 32 비트 여야합니다. 예를 들어 각 인스턴스에 대해 infront를 추가 할 수 있습니다. '(uint32_t) uchar [0] << 24' 그렇지 않으면 당신의 예제는 단지 0을 반환합니다. –

+0

@DimitarSlavchev 이동하기 전에 정수 프로모션이 수행됩니다. 그래서 너비는 적어도 16 비트입니다. 그러나 32 비트 int (및 8 비트 char)의 경우에도 uchar [0] << 24가 오버 플로우 될 수 있습니다. 이는 정의되지 않은 동작입니다. 그러므로'uint32_t'를 사용해야하고'uchar [0]'에 캐스팅해야합니다 ['int'는 32 비트보다 큽니다.]. –

+0

@DimitarSlavchev 내 실수. 그들 모두를'int'라고 부릅니다. –