有没有在Python中使用二进制数的简单方法?

时间:2018-03-16 07:42:17

标签: python python-3.x binary

我必须使用二进制格式化数字,我想知道是否有一种简单易用的内置方式来使用它们。我知道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再到二进制)。

3 个答案:

答案 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()