Я преобразовываю строковое представление адреса mac в массив из UINT8
s, определенный как unsigned char
. Мне любопытно, почему sscanf()
будет читать все 0s, когда я прочитал массив из UINT8
s и фактические значения, когда я прочитал массив регулярных 32 бит int
s. Его почти так же, как он измельчает 8 бит неправильного конца int.sscanf() hex ints в массив ints против unsigned chars
char *strMAC = "11:22:33:AA:BB:CC";
typedef unsigned char UINT8;
UINT8 uMAC[6];
int iMAC[6];
sscanf((const char*) strMac,
"%x:%x:%x:%x:%x:%x",
&uMAC[0], &uMAC[1], &uMAC[2], &uMAC[3], &uMAC[4], &uMAC[5]);
printf("%x:%x:%x:%x:%x:%x",
uMAC[0], uMAC[1], uMAC[2], uMAC[3], uMAC[4], uMAC[5]);
// output: 0:0:0:0:0:0
sscanf((const char*) strMac,
"%x:%x:%x:%x:%x:%x",
&iMAC[0], &iMAC[1], &iMAC[2], &iMAC[3], &iMAC[4], &iMAC[5]);
printf("%x:%x:%x:%x:%x:%x",
iMAC[0], iMAC[1], iMAC[2], iMAC[3], iMAC[4], iMAC[5]);
// output: 11:22:33:AA:BB:CC
Update: %hhx
будет работать на C99 и выше, но у меня есть старый кодовую, так что я в конечном итоге происходит с strtoul()
:
char *str = strMac;
int i = 0;
for(i = 0; i < 6; i++, str+=3) {
uMAC[i] = strtoul(str, NULL, 16);
}
Здесь вы вызываете неопределенное поведение, поэтому любое объяснение не будет завершено. –
'char * strMac =" 11: 22: 33: AA: BB: CC ";'? – EOF
@EOF thanks - fixed – ubtac