如何将HexString转换为无前缀掩码长度的整数有符号或无符号?[Python]

如何将HexString转换为无前缀掩码长度的整数有符号或无符号?[Python],python,bit-manipulation,bitwise-operators,Python,Bit Manipulation,Bitwise Operators,问题: Passing FFFFFFFFFFFFFFFFF Getting -1 Passing 9F1281F0 Getting -1626177040 Passing 1234 Getting 4660 print( hex2dec( "2" ) ) #2 print( hex2dec( "E" ) ) #-2 print( hex2dec( "4" ) ) #4 print( hex2dec( "FF" ) ) #-1 print( hex2dec( "0F" ) ) #15 pri

问题:

Passing FFFFFFFFFFFFFFFFF
Getting -1

Passing 9F1281F0
Getting -1626177040

Passing 1234
Getting 4660
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
在Python中,如何将HexString转换为Int-signed或unsigned,而不使用前缀掩码长度

嗯。。。已经存在与此相关的主题。但对于本规范,答案是不充分或不完整的。 我只想传递一个字符串(仅此而已),然后得到它的等价项(有符号或无符号,任意大小)

示例:

Passing FFFFFFFFFFFFFFFFF
Getting -1

Passing 9F1281F0
Getting -1626177040

Passing 1234
Getting 4660
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

经过几个小时的探索,我找到了一个解决方案

它将每个十六进制数字作为一个4位整数进行计算,虽然这并不总是正确的,但也不会成为问题

例如:0x7是0b111。因此,Python中的整数将有3位。检查:

a = 7
print( a.bit_length() )
#3
但是如果最高有效位(信号位)没有第四位,它将被计算为0,这正是我们在本例中想要的

因此,代码(未优化),但我能给出的最清晰的代码是:

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 

我投票结束这个问题,因为它不是一个问题,而是一个代码示例。嗯,有一些关于它的问题。。。但我还不能回答。我发现自己需要这个,并且认为它可以帮助更多的人。欢迎使用Stack Overflow!自我回答的问题很好,但你应该先提出真实的问题,然后再给出答案。您可以解释说,您想要一种将十六进制字符串转换为无需确定大小或掩码的有符号整数的方法,并且实际上可以说您找到的其他答案没有满足此要求。然后你可以立即回答(有一个按钮…)。但正如目前所写,这篇文章并没有遵循SO规则(阅读)。谢谢Serge。这比其他评论更友好、更有益。