2017-04-27 2 views
-2

Frage:Wie HexString in Int ohne Vorzeichenmaskierung mit Vorzeichen oder ohne Vorzeichen konvertieren? [Python]

Wie hexstring konvertieren, ohne Präfix Maskenlänge in Python mit oder ohne Vorzeichen Int?

Ja ... gibt es bereits Themen zu diesem Thema. Aber die Antworten waren für diese Spezifikation nicht ausreichend oder unvollständig. Ich wollte nur eine Zeichenfolge übergeben - nichts mehr - und erhalten Sie das Äquivalent (mit oder ohne Vorzeichen, jede Größe).

Beispiele:

Passing FFFFFFFFFFFFFFFFF 
Getting -1 

Passing 9F1281F0 
Getting -1626177040 

Passing 1234 
Getting 4660 
+0

Dieses besser [Dokumentation] gebucht werden konnten (http : //stackoverflow.com/documentation). – Selcuk

+1

Ich stimme für das Schließen dieser Frage als Off-Topic ab, da es sich nicht um eine Frage, sondern um ein Codebeispiel handelt. – Selcuk

+0

Nun, es gibt Fragen dazu ... aber ich kann noch nicht antworten. Ich habe das Bedürfnis und denke, dass es mehr Menschen helfen kann. –

Antwort

0

Nach einigen Stunden für diese Frage suchen, fand ich eine Lösung.

Es rechnet jede hexadezimale Zahl als eine 4-Bit-Ganzzahl ab, obwohl dies nicht immer wahr ist, wird es auch kein Problem sein.

Beispiel: 0x7 ist 0b111. Und so wird die Ganzzahl in Python 3 Bits haben. Erkundigen Sie sich bei:

a = 7 
print(a.bit_length()) 
#3 

Aber wenn es von der höchstwertigen Stelle (Signal-Bit) keine vierte Bit ist, wird es als 0 berechnet werden, genau das, was wir in diesem Fall wollen.

also der Code (nicht optimiert), aber die meisten lesbar ich darstellen kann, ist dies:

HEX_BITS = 4 

def shift_left1(bits): 
    #Left shift adding 1 instead of 0 
    mask = 0 
    for i in range(bits): 
     mask = (mask << 1) + 1 
    return mask 

def hex_signal(value, bits): 
    # Retuns the mask with bit signal 
    signal_mask = 1 << bits 
    return -(value & (signal_mask)) 

def hex_without_signal(value, bits): 
    # Returns value with the number of bits given (from less significant to most) 
    return value & shift_left1(bits) 

def hex2dec(hstring, signed=True): 
    value = int(hstring, 16) 
    if signed: #Do we want to check the signal? 
     value_bits = len(hstring) * HEX_BITS # A full hex digit have four bits 
     shift_times = value_bits - 1 # Times to subfunctions shifts 
     signal_mask = hex_signal(value, shift_times) # Mask with bit value setted 
     unsigned_hex_mask = hex_without_signal(value, shift_times) # Value without most significant bit 
     return signal_mask | unsigned_hex_mask # Or bit a bit from the unsigned value and signal mask 
    else: # If not just returns the native conversion 
     return value 

Beispiele:

print(hex2dec("2")) 
#2 
print(hex2dec("E")) 
#-2 
print(hex2dec("4")) 
#4 
print(hex2dec("FF")) 
#-1 
print(hex2dec("0F")) 
#15 
print(hex2dec("1F")) 
#31 
print(hex2dec("1234")) 
#4660 
print(hex2dec("9F1281F0")) 
#-1626177040 
Verwandte Themen