我必须使用二进制格式化数字,我想知道是否有一种简单易用的内置方式来使用它们。我知道bytearray
,但它适用于字节类型,它绝对不直观(至少对我而言)。
那么,有没有办法轻松处理二进制数(将它们分配给变量,执行位操作,转换为ASCII等)?如果没有内置,至少是一个不错且易于理解的模块。
以防万一我的要求不够清楚,这里有一个例子,说明我处理二进制文件的好方法是:
bin_num1 = Binary('100')
bin_num2 = Binary(0)
print(bin_num1.and(bin_num2)) # Prints 000
我正在使用Python 3.6,但任何版本的任何解决方案都可以完成这项任务。
修改1:
正如评论中所指出的那样,0bXXX
可以从二进制文件中获取type int
,就像bin()
会对opossite进行操作一样。仍然,这将使用整数,返回的结果将是一个整数和字符转换(例如bin('a')
)将是一个错误,需要进一步转换(从str到int再到二进制)。
答案 0 :(得分:4)
将二进制数分配给变量:您可以使用整数变量来保存二进制值。可以使用0b
前缀从二进制表示创建它们。
x = 0b110 # assigns the integer 6
执行位操作:位操作&
(和),|
(或),{ {1}}( xor ),^
( not )可用于整数并执行相应的二进制运算。
~
将它们转换为ASCII:要将数字转换为ASCII,您可以使用x = 0b110
y = 0b011
z = x & y # assigns the integer 0b010 (2)
。
chr
从ASCII转换:如果使用整数表示二进制值,则可以使用x = 0b1100001 # assigns 97
print(chr(x)) # prints 'a'
转换ASCII值。
ord
以二进制形式打印整数:可以使用字符串s = 'a'
x = ord(a) # assigns the integer 0b1100001 (97)
上的字符串格式方法以二进制打印整数。
"{0:b}"
如果您不介意x = 0b1100001
s = "{0:b}".format(x)
print(s) # prints '1100001'
前缀,也可以使用0b
。
bin
答案 1 :(得分:1)
您可以继承int并编写__new__
以将所需输入解析为整数的二进制。我目前有char和一个支持0和1的字符串。
现在,您可以将其用作整数及其所有二进制运算方法。如果使用这些方法,它只会保持转换为整数。因此,您必须使用魔术函数(双下划线或dunders)覆盖所有这些方法,以便继续返回Binary类。这可能是重复的,但是使用其他一些python魔法可以做得非常简洁。
NB。我可能错过了一些dunders(内部与否),如果您想了解更多内容,这是一个很好的参考:https://www.python-course.eu/python3_magic_methods.php
class Binary(int):
def __new__(self, val):
if type(val) is str:
if len(val) > 1:
val = int(val, 2)
else:
val = ord(val)
return super().__new__(self, val)
dunders_binary = "and rand add radd sub rsub mul rmul lshift rlshift " + \
"rshift rrshift and rand or ror xor rxor"
for dunder in ("__%s__" % s for s in dunders_binary.split()):
locals()[dunder] = lambda self, other, __f=dunder: \
self.__class__(getattr(super(), __f)(other))
dunders_unary = "neg pos invert"
for dunder in ("__%s__" % s for s in dunders_unary.split()):
locals()[dunder] = lambda self, __f=dunder: \
self.__class__(getattr(super(), __f)())
def __repr__(self):
return bin(self)
def __str__(self):
return bin(self)
答案 2 :(得分:1)
考虑到过去的程序员如何使用整数二进制/字节是很有趣的。今天使用Python的“切向”程序员可以走得很远,而不必过多担心计算机内部发生的事情。汇编代码?全息!
我是Python的新手,发现有趣的是它不支持无符号整数。
OP可能有助于学习或回想起十六进制字节由两个“半字节”组成。
Python文档包含“Bitwise Operations on Integer Types”部分。
OP和其他新的Python程序员可能对以下程序感兴趣:
#--------*---------*---------*---------*---------*---------*---------*---------*
# Desc: bits and bytes and ascii
#--------*---------*---------*---------*---------*---------*---------*---------*
import sys
while True:
for i in range(0, 16):
print(i, i.bit_length())
print(255, (255).bit_length())
print(256, (256).bit_length())
print((16).to_bytes(1, byteorder='big',signed=False))
print((255).to_bytes(1, byteorder='big',signed=False))
b = (255).to_bytes(1, byteorder='big',signed=False)
print(b)
print(b[0])
print("\nAscii Table")
for i in range(0, 256):
b = (i).to_bytes(1, byteorder='big',signed=False)
print(b[0], b, ord(b), chr(ord(b)))
sys.exit()