2013-05-21 2 views
1

제목에 쓰여 있듯이 8 바이트 (64 비트 int를 나타냄)를 포함하는 (char) 배열을 문자열. NEC78K0R (16 비트 mcu)에서 c 코드를 사용하고 있습니다. IAR Embedded Workbench IDE를 사용하고 있습니다.8 바이트 (64 비트 int를 나타내는)를 포함하는 (char) 배열을 문자열로 변환하는 방법

내 생각은 64 비트 int 형식 (예 : f.x long long 또는 int64_t (stdint.h))과 같이 OR로 묶은 다음 sprintf와 같은 것을 사용하여 문자열로 변환합니다.

그러나 나는 표준 64 비트 정수 유형 중 하나를 사용할 때마다 '존재하지 않는'유형 '오래 오래'.와 같은 오류를 뱉어 시작합니다 컴파일러.

어떤 도움이 많이 이해할 수있을 것이다.

+0

관련 주제 (전체 중복되지 않음) (unsigned long는 4 바이트라고 가정하여) : http://stackoverflow.com/questions/9695720/how-do-i-convert-a-64bit- integer-to-a-char-array-and-back? rq = 1 –

답변

1

char 배열을 참조하는 경우 실제로 진정한 64 비트 정수, 이 컴파일러는 int64_t 지원됩니다 8 바이트의 메모리 블록이, 당신은 단지 캐스트 역 참조 할 수 있습니다.

int64_t convert(const char* input) 
{ 
    return *((int64_t*)input); 
} 

플랫폼이 64 비트 데이터 유형을 지원하는 경우 sprintf%L 형식 지정자로 지원합니다. 당신의 컴파일이 어떤 64 비트 데이터 유형을 지원하지 않는 경우

, 당신은 BigInt 또는 GMPlib처럼, 당신을 위해 그 (것)들을 처리하기 위해 특정 라이브러리를 사용해야합니다.

0

long 해당 32 비트 정수형, 진수 형식이 확인 될 경우, 단지

char * p = <address of some memory containing a true 64bit number> 
char s[19]; 

는 리틀 엔디안 플랫폼 수행 빅 엔디안 플랫폼에 대한

sprintf(s, "0x%08x%08x, *((long*)(p+4)), *((long*)(p))); 

:

sprintf(s, "0x%08x%08x, *((long*)(p)), *((long*)(p+4))); 
0

필요한 문자열의 인코딩을 지정하지 않았습니다. 가장 간단한 방법은 16 진수 인코딩을 사용하고 바이트를 직접 인쇄하는 것입니다. 그런 당신을 위해 병목 인 경우

printf("0x%02x%02x%02x%02x%02x%02x%02x%02x", a[7], a[6], a[5], a[4], a[3], a[2], a[1], a[0]); 

은이 좀 더 효율적으로 만들려면 당신은 그룹 수 플랫폼이 unsigned long 예에 캐스팅하여 지원하는 최대 부품 그러나 char 어레이가 필요한 정렬을 수행하여 unsigned long으로 해석되면주의해야합니다. 보장 할 수 없다면 먼저 memcpy을 사용하여 올바르게 정렬 된 객체에 데이터를 복사해야합니다.

unsigned long b[2]; 
memcpy(b, a, sizeof b); 
printf("0x%08x%08x", b[1], b[0]); 

+0

예제는 거의 endian이 없다는 것을 유의해야합니다. – alk

+0

@alk, 좋은 발언. 그러나 그가 성취하기를 원하는 표현에 관해서 아무 말도하지 않았으므로, 이것은 다른 어떤 것과도 마찬가지로 훌륭합니다. –

관련 문제