2013-03-04 2 views
1

sprintf가 형식 지정자보다 많은 문자를 출력하는 임베디드 시스템 (Arduino와 비슷한 Libelium Waspmote)에서 sprintf과 관련된 문제가 발생했습니다. 이 특정 인스턴스에서 나는 배열의 바이트의 16 진수 값을 출력하기 위해 %02X을 사용하고 있습니다. 그러나 일부 바이트에서는 2 문자를 쓰는 대신 4가 쓰여지고 FF은 실제 바이트 값 앞에 접두사가 붙습니다. snprintf은 지정된 버퍼 크기를 존중하고 접두어 만 인쇄한다는 점을 제외하고는 비슷하게 작동합니다.s (n) printf 형식 지정자가 지정하는 것보다 많은 문자를 인쇄합니다.

char *pduChars = (char *) malloc(17*sizeof(char)); 
pduData.toChar(pduChars); 
for (int i = 0; i < 17; i++) { 
    char asciiCharsS[5]; 
    char asciiCharsSN[3]; 
    int printedS = sprintf(asciiCharsS, "%02X", pduChars[i]); 
    int printedSN = snprintf(asciiCharsSN, 3, "%02X", pduChars[i]); 
    USB.print(printedS); 
    USB.print(" "); 
    USB.print(printedSN); 
    USB.print(" "); 
    USB.print(asciiCharsS); 
    USB.print(" "); 
    USB.print(asciiCharsSN); 
    USB.println(" "); 
} 

그리고 (에만 오 바이트 요약 된) 그 단편의 출력 : 실제 바이트 순서가 0x00으로 0xFC에 0xFF 0xFF로되어야

참고로

여기 배열 인쇄 콘텐츠 코드 조각이며 0x48 0xA5 0x33을 0x51

sprintf snprintf sprintf Buffer snprintf Buffer


2 2 00 00
4 4 FFFC FF
4 4 FFFF FF
4 4 FFFF FF
2 2 48 48
4 4 FFA5 FF
2 2 33 33
2 2 51 51

여기에서 뭔가를 간과했거나 s(n)printf 구현과 관련된 플랫폼 관련 문제 일 수 있습니까?

+1

그것은 당신의 플랫폼에서'char'가 2 바이트가 될 수 있습니까? '% 02X '의 2는 최대 길이가 아닌 최소 길이입니다. – Shahbaz

+0

'sizeof (char)'는'1'을 반환하므로 그렇지 않다. –

+0

'sizeof (char)'는 항상 하나입니다. 이는 표준에 의해 정의됩니다. 그러나 그것이 1 바이트라는 것을 의미하지는 않습니다. 실제로'sizeof'는 바이트 수를주지 않고'char'의 크기에 비례하여 크기를 보여줍니다. – Shahbaz

답변

5

귀하의 구현이 개의 문자가 사용 된 것으로 추정됩니다. "%X" 형식의 경우 부호가없는 값이 필요합니다. 대신에 unsigned char을 전송하거나 사용하십시오.

/* cast */ 
int printedS = sprintf(asciiCharsS, "%02X", (unsigned char)pduChars[i]); 
int printedSN = snprintf(asciiCharsSN, 3, "%02X", (unsigned char)pduChars[i]); 

또는

/* use unsigned char */ 
unsigned char *pduChars = malloc(17); /* cast is, at best, redundant */ 
             /* sizeof (char) is, by definition, 1 */ 
2

사용중인 형식 지정자 한정자는 패딩에만 사용됩니다. 값의 기호 수가 지정된 값을 초과하는 경우 전체 문자열이 인쇄됩니다.

1

퍼센트 02X는 패딩입니다 ... 그것은 생략하지 않습니다 ... 그래서 경우에 대비하여 값이 다음 전체 문자열이 인쇄됩니다 지정된 값보다 큰

관련 문제