2013-01-16 27 views
7

Tôi có uint8_t orig[ETH_ALEN];in uint8_t

Làm thế nào tôi có thể in nó bằng cách sử __printf(3, 4)

được định nghĩa là #define __printf(a, b) __attribute__((format(printf, a, b)))

các Orig phải là địa chỉ phần cứng Ethernet.

+2

'% u' làm việc cho bất kỳ 'uintN_t', tôi nghĩ, hoặc ít nhất là' uint8_t'. – rvighne

Trả lời

9

Bạn cần phải tạo chuỗi định dạng phù hợp. Chức năng printf() không có cách nào in một mảng trong một đi, vì vậy bạn cần phải chia nó và in mỗi 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); 

các & 0xff là để đảm bảo onlu 8 bit được gửi đến printf(); chúng không cần thiết cho một loại không dấu như uint8_t mặc dù vậy bạn cũng có thể thử mà không cần.

Giả định một MAC 48 bit thông thường và in bằng cách sử dụng conventional kiểu hex được phân cách bằng dấu hai chấm.

+0

'uint8_t' được đảm bảo chỉ có 8 bit để mặt nạ không cần thiết. Nhưng, thậm chí sau đó hơn 8 bit sẽ được gửi đi bởi vì 'printf' là variadic nên tất cả chúng sẽ được phát triển thành' unsigned int'. – dreamlax

+1

@dreamlax Tất cả các giá trị của 'uint8_t' được thể hiện dưới dạng' int', vì vậy các chương trình khuyến mãi số nguyên [và do đó khuyến mãi đối số mặc định] sẽ quảng bá 'uint8_t' thành' int'. –

+0

@DanielFischer: D'oh đó là những gì tôi có nghĩa là ... 'unsigned' ra khỏi hư không. Những gì tôi có nghĩa là hơn 8 bit sẽ được trao cho printf vì xúc tiến số nguyên. – dreamlax

12

Sử dụng C99 định dạng specifiers:

#include <inttypes.h> 

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

bạn đang thiếu "%" trước macro, tôi nghĩ vậy. –

+0

@ JensGustedt Bạn nói đúng. Cố định, cảm ơn. –

+0

trong VC2013, được xác định là% u – Tanguy