如何将十六进制字符串转换为无前缀掩码长度的有符号或无符号整数?[Python]

2024-04-27 04:05:31 发布

您现在位置:Python中文网/ 问答频道 /正文

问题:

在Python中,如何将十六进制字符串转换为无前缀掩码长度的Int有符号或无符号字符串?你知道吗

是的。。。已经存在有关此的主题。但对于这个规范来说,答案是不充分或不完整的。 我只想传递一个字符串-仅此而已-并得到它的等价项(有符号或无符号,任意大小)。你知道吗

示例:

Passing FFFFFFFFFFFFFFFFF
Getting -1

Passing 9F1281F0
Getting -1626177040

Passing 1234
Getting 4660

Tags: 字符串答案规范示例主题符号int等价
1条回答
网友
1楼 · 发布于 2024-04-27 04:05:31

经过几个小时的研究,我找到了一个解决办法。你知道吗

它将每一个十六进制数字作为一个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 

示例:

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

相关问题 更多 >