搜索
bottom↓
回复: 24

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

[复制链接]

出0入0汤圆

发表于 2018-10-18 15:14:21 | 显示全部楼层 |阅读模式
网上 都是 16进制转整数  一个int()就可以了


比如 0xFE  -->> -2

实际得的是  254  

怎么整

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入16汤圆

发表于 2018-10-18 15:19:40 | 显示全部楼层
254-256=-2?

出0入0汤圆

 楼主| 发表于 2018-10-18 15:20:12 | 显示全部楼层
目前 不考虑代码是否难看

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

比如 0xFE 等于 254

254 大于 128

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

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

出0入0汤圆

 楼主| 发表于 2018-10-18 15:23:00 | 显示全部楼层


if 用的有点难受

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

出0入0汤圆

发表于 2018-10-18 15:27:21 | 显示全部楼层
感觉python里面的数据格式转换太蛋疼了。。。

出0入0汤圆

发表于 2018-10-18 15:37:16 | 显示全部楼层
https://docs.python.org/3/library/struct.html

  1. >>> from struct import *
  2. >>> pack('hhl', 1, 2, 3)
  3. b'\x00\x01\x00\x02\x00\x00\x00\x03'
  4. >>> unpack('hhl', b'\x00\x01\x00\x02\x00\x00\x00\x03')
  5. (1, 2, 3)
  6. >>> calcsize('hhl')
  7. 8
复制代码

出0入0汤圆

发表于 2018-10-18 15:46:22 | 显示全部楼层
def hex2int(hexnum):
    return ~(0xFF^hexnum)

print(hex2int(0xFE))

出0入0汤圆

发表于 2018-10-18 17:07:24 | 显示全部楼层
import struct
x = 0xff
c = struct.unpack('b', bytes([x]))
print(c[0])

出0入0汤圆

 楼主| 发表于 2018-10-18 21:09:53 | 显示全部楼层
shower.xu 发表于 2018-10-18 15:46
def hex2int(hexnum):
    return ~(0xFF^hexnum)

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

出0入0汤圆

 楼主| 发表于 2018-10-18 21:15:23 | 显示全部楼层
zhonghua_li 发表于 2018-10-18 17:07
import struct
x = 0xff
c = struct.unpack('b', bytes([x]))

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

出330入0汤圆

发表于 2018-10-19 00:47:42 来自手机 | 显示全部楼层
抛弃Python,改用别的平台

出0入0汤圆

发表于 2018-10-19 14:57:23 | 显示全部楼层
ywlzh 发表于 2018-10-18 21:15
这个方法还需要额外区分 8位数 16位数 32位数

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

出0入0汤圆

发表于 2018-10-19 15:38:21 | 显示全部楼层
#16进制到10进制
>>> int('ff', 16)
255

出0入0汤圆

 楼主| 发表于 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楼的办法就可以,只是事先判断下正负,负数可以统一处理

看图:


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 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

出0入0汤圆

发表于 2018-10-20 12:44:48 | 显示全部楼层
ywlzh 发表于 2018-10-19 17:11
莫要以其他语言的角度看待python

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

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

出0入0汤圆

发表于 2018-10-20 20:42:41 | 显示全部楼层
0xff,如果 这个数16位, 对应的是255,如果是8位数,对应的是-1

出105入79汤圆

发表于 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

出105入79汤圆

发表于 2018-10-20 22:47:07 | 显示全部楼层
python3的来了

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

>> -2

出0入0汤圆

发表于 2018-10-21 15:58:23 | 显示全部楼层
qwe2231695 发表于 2018-10-20 22:47
python3的来了

import struct

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

出105入79汤圆

发表于 2018-10-21 16:02:22 | 显示全部楼层
Jach 发表于 2018-10-21 15:58
a, = struct.unpack('b', b'\xfe') 在Python2, 3下都可以

  爽啊

出0入0汤圆

发表于 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位, 應該是個正數. 沒弄懂這個轉換是在做什麼.

出0入0汤圆

 楼主| 发表于 2018-10-21 18:30:16 | 显示全部楼层
Jach 发表于 2018-10-21 16:06
這個轉換很奇怪
>>> print(hex2int(0xF001))
>>> -61695

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

你有更好的办法吗

出0入0汤圆

发表于 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

出0入0汤圆

 楼主| 发表于 2018-10-22 16:30:40 | 显示全部楼层
Jach 发表于 2018-10-22 16:19
這是在stackoverflow上提到諸多答案之一

def twos_comp(val, bits):

这个 贼强  厉害了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 02:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表