ywlzh 发表于 2018-10-18 15:14:21

[请教] python 如何简单将16进制的数转成负数

网上 都是 16进制转整数一个int()就可以了


比如 0xFE-->> -2

实际得的是254

怎么整

xstt 发表于 2018-10-18 15:19:40

254-256=-2?

ywlzh 发表于 2018-10-18 15:20:12

目前 不考虑代码是否难看

直接通过获取值来判断大小范围

比如 0xFE 等于 254

254 大于 128

结果就是(254-256) 等于 -2

同理16 位 32位的
........

ywlzh 发表于 2018-10-18 15:23:00

xstt 发表于 2018-10-18 15:19
254-256=-2?


if 用的有点难受

有没有一个好点的库函数 直接一步到位的

yyliu 发表于 2018-10-18 15:27:21

感觉python里面的数据格式转换太蛋疼了。。。

apple_eat 发表于 2018-10-18 15:37:16

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

shower.xu 发表于 2018-10-18 15:46:22

def hex2int(hexnum):
    return ~(0xFF^hexnum)

print(hex2int(0xFE))

zhonghua_li 发表于 2018-10-18 17:07:24

import struct
x = 0xff
c = struct.unpack('b', bytes())
print(c)

ywlzh 发表于 2018-10-18 21:09:53

shower.xu 发表于 2018-10-18 15:46
def hex2int(hexnum):
    return ~(0xFF^hexnum)



这个方法 输入正数的16进制 得到错误的结果

ywlzh 发表于 2018-10-18 21:15:23

zhonghua_li 发表于 2018-10-18 17:07
import struct
x = 0xff
c = struct.unpack('b', bytes())


这个方法还需要额外区分 8位数 16位数 32位数

zcllom 发表于 2018-10-19 00:47:42

抛弃Python,改用别的平台

Jach 发表于 2018-10-19 14:57:23

ywlzh 发表于 2018-10-18 21:15
这个方法还需要额外区分 8位数 16位数 32位数

不知寬度, 怎麼決定sign bit的位置? 也就無從轉換起了

eric112 发表于 2018-10-19 15:38:21

#16进制到10进制
>>> int('ff', 16)
255

ywlzh 发表于 2018-10-19 17:11:07

本帖最后由 ywlzh 于 2018-10-19 17:15 编辑

Jach 发表于 2018-10-19 14:57
不知寬度, 怎麼決定sign bit的位置? 也就無從轉換起了

莫要以其他语言的角度看待python

要想区分8位 16位 32位 拿C++ 来说,一个template 就足够了

再看看python int()函数


我只是想要找到和这一般简单的处理办法

7楼的办法就可以,只是事先判断下正负,负数可以统一处理

看图:


而我想要的 看看有没有办法 正负数统一处理

ywlzh 发表于 2018-10-19 17:36:55

按照 7楼的做法 改进 如下:

def hex2int(hexnum):
    if (0xFFFFFFFF >= hexnum >= 0x80000000) or \
      (0xFFFF >= hexnum >= 0x8000)or\
      (0xFF >= hexnum >= 0x80):
      return ~(0xFF ^ hexnum)
    else:
      return hexnum

Jach 发表于 2018-10-20 12:44:48

ywlzh 发表于 2018-10-19 17:11
莫要以其他语言的角度看待python

要想区分8位 16位 32位 拿C++ 来说,一个template 就足够了


這事和哪個語言無關, 大家用的都是2's complement數值表示法, 如果不知道sign bit的位置, 這個數沒一點意義. 即使在你he2int裏也是需要的.

zhonghua_li 发表于 2018-10-20 20:42:41

0xff,如果 这个数16位, 对应的是255,如果是8位数,对应的是-1

qwe2231695 发表于 2018-10-20 22:43:07

我用python一处理字节数据,就被这些问题反复烦恼。pack unpack hex2int 。。。

搞了一个简单的 ,但只能python2.7 ,python3的struct.unpack喝bytes有所升级

import struct
a,=struct.unpack("b",chr(0xfe))
print(a)

>> -2

qwe2231695 发表于 2018-10-20 22:47:07

python3的来了

import struct
a,=struct.unpack("b",(0xfe).to_bytes(1,byteorder = 'little'))
print(a)

>> -2

Jach 发表于 2018-10-21 15:58:23

qwe2231695 发表于 2018-10-20 22:47
python3的来了

import struct


a, = struct.unpack('b', b'\xfe') 在Python2, 3下都可以

qwe2231695 发表于 2018-10-21 16:02:22

Jach 发表于 2018-10-21 15:58
a, = struct.unpack('b', b'\xfe') 在Python2, 3下都可以

{:shocked:}爽啊

Jach 发表于 2018-10-21 16:06:43

ywlzh 发表于 2018-10-19 17:36
按照 7楼的做法 改进 如下:

def hex2int(hexnum):


這個轉換很奇怪
>>> print(hex2int(0xF001))
>>> -61695
如果0xF001是16位, 那範圍該在-32768~+32767, 如果是32位, 應該是個正數. 沒弄懂這個轉換是在做什麼.

ywlzh 发表于 2018-10-21 18:30:16

Jach 发表于 2018-10-21 16:06
這個轉換很奇怪
>>> print(hex2int(0xF001))
>>> -61695


你是看到17楼的 说的 然后又试了下

你有更好的办法吗

Jach 发表于 2018-10-22 16:19:13

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

ywlzh 发表于 2018-10-22 16:30:40

Jach 发表于 2018-10-22 16:19
這是在stackoverflow上提到諸多答案之一

def twos_comp(val, bits):


这个 贼强厉害了
页: [1]
查看完整版本: [请教] python 如何简单将16进制的数转成负数