2010-04-12 6 views
1

나는이 두 가지 인쇄 기능이 같은 일을 할 :ANSI-C를 unsigned int *에서 char *로 변환하는 방법은 무엇입니까?

배열은 부호없는 INT이다
unsigned int Arraye[] = {0xffff,0xefef,65,66,67,68,69,0}; 
      char Arrage[] = {0xffff,0xefef,65,66,67,68,69,0}; 
    printf("%s", (char*)(2+ Arraye)); 
    printf("%s", (char*)(2+ Arrage)); 

. 일반적으로 타입을 변경 하겠지만, 문제는 특정 섹션이 ASCII로 인쇄되어야하지만 대부분의 배열이 숫자라는 것입니다. 현재 부호없는 배열은 "A"로 인쇄되고 문자 배열은 원하는 "ABCDE"로 인쇄됩니다.

+2

왜 "바이트"에 16 비트가 포함되어 있습니까? – kennytm

+0

0xffff << 1이 0xfffe 이고 이 내 데이터 – Mikhail

+0

(부호없는 정수)의 표준 표현 인 0xffff가 메모리에서 0x0000ffff가되고 싶습니다. C 문자열은 null로 끝나기 때문에 예상 한 것을 제공하지 않습니다. –

답변

1

이렇게하면 unsigned int 버전이 32 비트 빅 엔디안 정수로 가정되어 메모리에 정렬됩니다.

00 00 ff ff 00 00 ef ef 00 00 00 41 00 00 00 42 
00 00 00 43 00 00 00 44 00 00 00 45 00 00 00 00 

char 버전은 8 비트 문자를 가정하면, 메모리에 배치되는 방식이다. 0xffffchar에 맞지 않습니다.

ff ef 41 42 43 44 45 00 

캐스팅이 충분하지 않음을 알 수 있습니다. 실제로 데이터를 변환해야합니다.

시스템에서 32 비트 wchar_t을 사용하는 경우 printf에 길이 수정 자 l을 사용할 수 있습니다.

printf("%ls", 2 + Arraye); 

이것은 휴대용이 아닙니다. 대안은 다음과 같이 손으로 char 배열에 뭔가를 unsigned int 배열을 복사하는 것입니다 : 디트리히가 말했듯이, 간단한 캐스팅하지 않을

void print_istr(unsigned int const *s) 
{ 
    unsigned int const *p; 
    char *s2, *p2; 
    for (p = s; *p; p++); 
    s2 = xmalloc(p - s + 1); 
    for (p = s, p2 = s2; *p2 = *p; p2++, p++); 
    fputs(s2, stdout); 
    free(s2); 
} 
+0

설명해 주셔서 감사 드리며, 이런 일을 끝내 셨습니다. – Mikhail

+0

임시 해결책으로 메모리를 할당하는 함수가 마음에 들지 않기 때문에 다른 해결책을 제안했습니다. –

0

,하지만 당신도 복잡한 변환을 필요가 없습니다. 배열을 반복하면됩니다.

uint_t Arraye[] = {0xffff,0xefef,65,66,67,68,69,0}; 
    char Arrage[] = {0xffff,0xefef,65,66,67,68,69,0}; 

uint_t *p; 
for(p = Arraye+2; p; p++) 
    printf("%c", p); 

printf("%s", (char*)(2+ Arrage)); 
관련 문제