2013-03-04 59 views
1

在嵌入式系統(Libelium Waspmote,類似於Arduino)中,我遇到了一個sprintf的奇怪問題,sprintf輸出的字符數超過格式說明符給出的字符數。在這個特定的實例中,我使用%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 2013-03-04 12:48:12

+0

'sizeof(char)'返回'1',所以它似乎並非如此。 – 2013-03-04 13:01:26

+0

'sizeof(char)'總是一個。這是由標準定義的。但這並不意味着它是一個字節。實際上,'sizeof'沒有給出字節數,它顯示了相對於'char'大小的大小。 – Shahbaz 2013-03-04 13:09:27

回答

5

我猜你的實施是使用簽署字符。格式"%X"預計值無符號值。改用Cast或使用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是一個用來填充......它不會省略...... 這樣的情況下,你的價值超過規定值,則整個字符串將在更大