[请教] python 如何简单将16进制的数转成负数
网上 都是 16进制转整数一个int()就可以了比如 0xFE-->> -2
实际得的是254
怎么整 254-256=-2?
目前 不考虑代码是否难看
直接通过获取值来判断大小范围
比如 0xFE 等于 254
254 大于 128
结果就是(254-256) 等于 -2
同理16 位 32位的
........ xstt 发表于 2018-10-18 15:19
254-256=-2?
if 用的有点难受
有没有一个好点的库函数 直接一步到位的 感觉python里面的数据格式转换太蛋疼了。。。 https://docs.python.org/3/library/struct.html
>>> from struct import *
>>> pack('hhl', 1, 2, 3)
b'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', b'\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('hhl')
8 def hex2int(hexnum):
return ~(0xFF^hexnum)
print(hex2int(0xFE)) import struct
x = 0xff
c = struct.unpack('b', bytes())
print(c) shower.xu 发表于 2018-10-18 15:46
def hex2int(hexnum):
return ~(0xFF^hexnum)
这个方法 输入正数的16进制 得到错误的结果 zhonghua_li 发表于 2018-10-18 17:07
import struct
x = 0xff
c = struct.unpack('b', bytes())
这个方法还需要额外区分 8位数 16位数 32位数 抛弃Python,改用别的平台 ywlzh 发表于 2018-10-18 21:15
这个方法还需要额外区分 8位数 16位数 32位数
不知寬度, 怎麼決定sign bit的位置? 也就無從轉換起了 #16进制到10进制
>>> int('ff', 16)
255 本帖最后由 ywlzh 于 2018-10-19 17:15 编辑
Jach 发表于 2018-10-19 14:57
不知寬度, 怎麼決定sign bit的位置? 也就無從轉換起了
莫要以其他语言的角度看待python
要想区分8位 16位 32位 拿C++ 来说,一个template 就足够了
再看看python int()函数
我只是想要找到和这一般简单的处理办法
7楼的办法就可以,只是事先判断下正负,负数可以统一处理
看图:
而我想要的 看看有没有办法 正负数统一处理 按照 7楼的做法 改进 如下:
def hex2int(hexnum):
if (0xFFFFFFFF >= hexnum >= 0x80000000) or \
(0xFFFF >= hexnum >= 0x8000)or\
(0xFF >= hexnum >= 0x80):
return ~(0xFF ^ hexnum)
else:
return hexnum ywlzh 发表于 2018-10-19 17:11
莫要以其他语言的角度看待python
要想区分8位 16位 32位 拿C++ 来说,一个template 就足够了
這事和哪個語言無關, 大家用的都是2's complement數值表示法, 如果不知道sign bit的位置, 這個數沒一點意義. 即使在你he2int裏也是需要的. 0xff,如果 这个数16位, 对应的是255,如果是8位数,对应的是-1 我用python一处理字节数据,就被这些问题反复烦恼。pack unpack hex2int 。。。
搞了一个简单的 ,但只能python2.7 ,python3的struct.unpack喝bytes有所升级
import struct
a,=struct.unpack("b",chr(0xfe))
print(a)
>> -2
python3的来了
import struct
a,=struct.unpack("b",(0xfe).to_bytes(1,byteorder = 'little'))
print(a)
>> -2 qwe2231695 发表于 2018-10-20 22:47
python3的来了
import struct
a, = struct.unpack('b', b'\xfe') 在Python2, 3下都可以 Jach 发表于 2018-10-21 15:58
a, = struct.unpack('b', b'\xfe') 在Python2, 3下都可以
{:shocked:}爽啊 ywlzh 发表于 2018-10-19 17:36
按照 7楼的做法 改进 如下:
def hex2int(hexnum):
這個轉換很奇怪
>>> print(hex2int(0xF001))
>>> -61695
如果0xF001是16位, 那範圍該在-32768~+32767, 如果是32位, 應該是個正數. 沒弄懂這個轉換是在做什麼. Jach 发表于 2018-10-21 16:06
這個轉換很奇怪
>>> print(hex2int(0xF001))
>>> -61695
你是看到17楼的 说的 然后又试了下
你有更好的办法吗 ywlzh 发表于 2018-10-21 18:30
你是看到17楼的 说的 然后又试了下
你有更好的办法吗
這是在stackoverflow上提到諸多答案之一
def twos_comp(val, bits):
"""compute the 2's complement of int value val"""
if (val & (1 << (bits - 1))) != 0: # if sign bit is set e.g., 8bit: 128-255
val = val - (1 << bits) # compute negative value
return val
>>> twos_comp(0xfe, 8)
>>> -2
>>> twos_comp(0xfffe, 16)
>>> -2
>>> twos_comp(0xfffffffe, 32)
>>> -2
Jach 发表于 2018-10-22 16:19
這是在stackoverflow上提到諸多答案之一
def twos_comp(val, bits):
这个 贼强厉害了
页:
[1]