• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Konwersja z HEX do DEC
#1
Cześć. Już się powoli poddaję. Może ktoś mnie poratuje Smile
Potrzebuje przekonwertować wartość HEX ( odczyt numeru karty RFID ) z wartości HEX do DEC.
Normalnie z 1300449B4A powinna wyjść wartość 81608874826 a w Arduino wychodzi mi 4496202 Sad


Kod mam taki :

Kod:
unsigned long hexToDec(string hexString) {
  unsigned long decValue = 0;
  char nextInt;
  for ( long i = 0; i < hexString.length(); i++ ) {
    nextInt = toupper(hexString[i]);
    if ( isxdigit(nextInt) ) {
      if (nextInt >= '0' && nextInt <= '9') nextInt = nextInt - '0';
      if (nextInt >= 'A' && nextInt <= 'F') nextInt = nextInt - 'A' + 10;
      decValue = (decValue << 4) + nextInt;
    }
  }
  return decValue;
}

Wywołuję:

Kod:
string test = "1300449B4A";
  Serial.println(hexToDec(test));

i dostaje 4496202.

Czy ktoś może mi pomóc w kawałku kodu który zrobi to tak jak powinno być ?
 
Odpowiedź
#2
Wygląda na to, że "unsigned long" ma 32-bity, dlatego wynik wychodzi 4496202.
Możesz spróbować użyć "unsigned long long".
 
Odpowiedź
#3
No niestety dalej nic z tego. Nie uzykuję pożądanej wartości Sad
Może jakieś inne pomysły?
 
Odpowiedź
#4
Może spróbuj jeszcze raz, u mnie działa:
Kod:
unsigned long long hexToDec(String hexString) {
  unsigned long long decValue = 0;
  char nextInt;
  for ( long i = 0; i < hexString.length(); i++ ) {
    nextInt = toupper(hexString[i]);
    if ( isxdigit(nextInt) ) {
      if (nextInt >= '0' && nextInt <= '9') nextInt = nextInt - '0';
      if (nextInt >= 'A' && nextInt <= 'F') nextInt = nextInt - 'A' + 10;
      decValue = (decValue << 4) + nextInt;
    }
  }
  return decValue;
}

 
void setup() {
  Serial.begin(9600);
  Serial.println("Hello World!");

  String test = "1300449B4A";
  unsigned long long dec = hexToDec(test);
  Serial.print((unsigned long)(dec / 1000000ULL));
  Serial.println((unsigned long)(dec % 1000000ULL));
}

void loop() {
}
 
Odpowiedź
#5
Zrobiłem tak i śmiga Smile

Kod:
  uint64_t getUInt64fromHex(char const * str)
  {
    uint64_t DECKarty = 0;
    for (size_t i = 0 ; isxdigit((unsigned char)str[i]) ; ++i)
    {
      char c = str[i];
      DECKarty *= 16;
      if (isdigit(c)) /* '0' .. '9'*/
        DECKarty += c - '0';
      else if (isupper(c)) /* 'A' .. 'F'*/
        DECKarty += c - 'A' + 10;
      else /* 'a' .. 'f'*/
        DECKarty += c - 'a' + 10;
    }
    return DECKarty;
  }


Dziękuję za podpowiedzi Smile
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości