Преобразование шестнадцатеричных байтов UID MFRC522 в печатаемые десятичные числа

Я использую библиотеку MFRC522 на моем Arduino UNO, чтобы читать информацию о RFID-тегах Mifare.

// Print HEX UID
Serial.print("Card UID:");
for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
} 
Serial.println();

У меня есть байтовый массив (4), который содержит HEX UID:

54 C7 FD 5A

Но мне не удалось преобразовать его в десятичный формат:

HEX(5AFDC754) => DEC(1526581076)

Я попытался преобразовать массив байтов в char в обратном порядке, но компилятор не разрешил мне распечатать Dec.

char str[8];
int k = 0;

for (int i = 3; i >= 0 ; i -= 1) {
    char hex[4];
    snprintf(s, 4, "%x", mfrc522.uid.uidByte[i]);

    for( int t = 0; t < 4; t++ ) {
        if( (int)hex[t] != 0 )
            str[t+k] = hex[t];
    }

    k+=2;
}

Serial.println( str, DEC);

Любое предложение приветствуется


person jeremy5189    schedule 10.02.2014    source источник


Ответы (1)


Вам нужно будет объединить 4 шестнадцатеричных байта в одно целое число без знака.

Это зависит от порядка байтов (ищите его).

Для Big Endian:

  unsigned int hex_num;
  hex_num =  uidByte[0] << 24;
  hex_num += uidByte[1] << 16;
  hex_num += uidByte[2] <<  8;
  hex_num += uidByte[3];

Для Little Endian измените порядок позиций uidByte на противоположный.

person Thomas Matthews    schedule 10.02.2014
comment
unsigned int нельзя сохранить uidByte[0] << 24, но long long нельзя напечатать с Serial.println() - person jeremy5189; 12.02.2014
comment
Что sizeof(int) в вашей системе? - person Thomas Matthews; 12.02.2014
comment
Спасибо, у меня работает! unsigned int составляет четыре байта, поэтому работает отлично. - person dudasaus; 13.03.2018
comment
warning: left shift count >= width of type Я получаю это предупреждение при использовании "проверить". Однако он компилируется и работает нормально. Какие-нибудь советы? - person Roelant; 20.02.2020