Cum pot converti hexagonal în zecimal în Python? [duplicat] (Programare, Python, Hexagonal, Zecimal)

Domnule D a intrebat.

Am un cod Perl în care funcția hex() convertește datele hexagonale în zecimale. Cum pot face acest lucru pe Python?

Comentarii

  • Sunteți sigur că doriți să convertiți datele în „zecimale”? Funcția Perl convertește pur și simplu un șir hexagonal într-un număr întreg, nu într-un șir zecimal. –  > Por Sven Marnach.
  • @SvenMarnach Eu folosesc acest manual perl hex() misc-perl-info.com/perl-hex.html „Această funcție: are ca argument un șir hexazecimal (sau o expresie care după evaluare va returna un șir hexazecimal) va returna valoarea corespunzătoare în zecimal” – –  > Por Sir D.
  • @Sir D: acest articol este foarte prost formulat. Așa cum spune Sven, hex convertește un șir hexazecimal într-o valoare întreagă (care este stocată intern în binar, dar care, în esență, este pur și simplu o valoare numerică fără o bază). Apelul către print convertește acea valoare într-un șir zecimal și o imprimă. –  > Por Borodin.
  • Întrebarea extinsă „Cum se convertește din hexazecimal SAU zecimal (SAU binar) în număr întreg așa cum face interpretul python.” are răspuns în întrebarea „are deja răspuns aici”. int(string,base) funcția deduce baza șirului de intrare din prefixul șirului Dacă treceți 0 ca bază. ex. int(„0x1402”,0) int(„0b10100000000000010”,0) int(„5122”,0) stackoverflow.com/questions/209513/… -… –  > Por gaoithe.
3 răspunsuri
Sven Marnach

Dacă prin „date hexagonale” vă referiți la un șir de caractere de forma

s = "6a48f82d8e828ce82b82"

puteți folosi

i = int(s, 16)

pentru a-l converti în număr întreg și

str(i)

pentru a-l converti într-un șir zecimal.

Comentarii

  • Pentru un număr hexazecimal negativ, acest lucru nu funcționează. –  > Por user218867.
  • @EricWang Acest lucru funcționează perfect pentru numere negative: ideone.com/IHOQvp. Cu excepția cazului în care aveți un număr negativ codificat în format de complement de doi cu lățime fixă, dar aceasta ar fi o problemă diferită de cea care a fost întrebată aici. (Sfat: utilizați struct în acest caz). –  > Por Sven Marnach.
  • @SvenMarnach Da, mă refer la 2’complement folosit în format elf64. –  > Por user218867.
  • hexazecimal -> zecimal -> binar -> zecimal: int(bin(int(hex(42), 16)), 2) –  > Por arcolife.
  • Atenție, acesta este un big endian interpretare. Aceasta ar fi potrivită pentru unele lucruri (multe protocoale de rețea, de exemplu, sunt big endian), dar nu și pentru altele, cum ar fi să te uiți la intern datele interne ale programului din majoritatea sistemelor actuale, care sunt nativ little endian. –  > Por Chris Stratton.
Tim Pietzcker
>>> int("0xff", 16)
255

sau

>>> int("FFFF", 16)
65535

Citiți documentația.

Comentarii

  • int(0xff) va face ceea ce trebuie. Necesită o bază explicită doar dacă este transmisă ca un șir de caractere. –  > Por cassm.
  • @cassm și, de fapt, nu are niciun rost să int() în acest caz – este ca și cum ai scrie int(255) – se poate scrie pur și simplu 0xff –  > Por jbg.
wim

Ați putea folosi o evaluare literală:

>>> ast.literal_eval('0xdeadbeef')
3735928559

Sau doar specificați baza ca argument pentru int:

>>> int('deadbeef', 16)
3735928559

Un truc care nu este bine cunoscut, dacă specificați baza 0 la int, , atunci Python va încerca să determine baza din prefixul șirului de caractere:

>>> int("0xff", 0)
255
>>> int("0o644", 0)
420
>>> int("0b100", 0)
4
>>> int("100", 0)
100