2013-01-16 41 views
7

uint8_t orig[ETH_ALEN];打印uint8_t

我如何可以打印使用其定義爲#define __printf(a, b) __attribute__((format(printf, a, b)))

__printf(3, 4)

的原稿應該是以太網硬件地址。

+2

'%用於任何'uintN_t' u'的作品,我想,或至少'uint8_t'。 – rvighne

回答

9

您需要構造一個適合的格式字符串。該printf()函數沒有打印一氣呵成數組的方式,所以你需要把它分解並打印出每個uint8_t

__printf("MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", 
     orig[0] & 0xff, orig[1] & 0xff, orig[2] & 0xff, 
     orig[3] & 0xff, orig[4] & 0xff, orig[5] & 0xff); 

& 0xff是確保onlu 8位被髮送到printf();他們不應該需要像uint8_t這樣的無符號類型,儘管如此,您也可以嘗試。

這假設了一個常規的48位MAC,並使用冒號分隔的十六進制樣式打印出conventional

+0

'uint8_t'保證只有8位,所以掩碼是不必要的。但是,即使如此,仍然會發送8位以上的數據,因爲'printf'是可變參數,因此它們都將被提升爲'unsigned int'。 – dreamlax

+1

@dreamlax一個'uint8_t'的所有值都可以表示爲一個'int',所以整數提升[以及默認參數提升]將'uint8_t'提升爲'int'。 –

+0

@DanielFischer:哦,這就是我的意思......'無符號'從哪兒冒出來。我的意思是由於整數提升而給printf多了8位。 – dreamlax

12

使用C99格式說明:

#include <inttypes.h> 

printf("%" PRIu8 "\n", orig[0]); 
+3

你錯過了宏之前的「%」,我想。 –

+0

@JensGustedt你是對的。修正了,謝謝。 VC2013中的 – 2013-01-16 14:08:30

+0

,其定義爲%u – Tanguy