低于a和b(十六进制),表示二进制补码有符号二进制数.
例如:
a = 0x17c7cc6e
b = 0xc158a854
现在我想知道一个&的签名代表.基础10中的b.抱歉,我是一名低级程序员,也是python的新手;问这个问题感觉非常愚蠢.我不关心额外的图书馆,但答案应该简单明了.背景:a& b是从UDP分组中提取的数据.我无法控制格式.所以请不要给我一个答案,假设我可以事先改变那些变量的格式.
我转换了一个& b用以下内容进入以下内容:
aBinary = bin(int(a, 16))[2:].zfill(32) => 00010111110001111100110001101110 => 398969966
bBinary = bin(int(b, 16))[2:].zfill(32) => 11000001010110001010100001010100 => -1051154348
我试图做这样的事情(不起作用):
if aBinary[1:2] == 1:
aBinary = ~aBinary + int(1, 2)
在python中执行此操作的正确方法是什么?
解决方法:
您至少必须知道数据的宽度.例如,0xc158a854有8个十六进制数字,因此它必须至少为32位宽;它似乎是一个无符号的32位值.我们可以使用一些按位操作来处理它:
In [232]: b = 0xc158a854
In [233]: if b >= 1<<31: b -= 1<<32
In [234]: b
Out[234]: -1051154348L
这里的L标志着Python 2已经切换到将值作为long处理;它通常并不重要,但在这种情况下表示我一直在处理此安装的公共int范围之外的值.从诸如UDP分组的二进制结构中提取数据的工具是struct.unpack;如果您只是告诉它您的值是首先签名的,它将产生正确的值:
In [240]: s = '\xc1\x58\xa8\x54'
In [241]: import struct
In [242]: struct.unpack('>i', s)
Out[242]: (-1051154348,)
假设两个补码表示;一个补码(例如UDP中使用的校验和),符号和幅度,或IEEE 754浮点数是一些不太常见的数字编码.
标签:python,python-2-7,hex,binary
来源: https://codeday.me/bug/20190717/1490315.html