从 bin 转换为 int/char 而不会丢失前导“0”

Convert from bin to int/char without loosing leading "0"

有没有那个

>>> int('0000001',2)
1

可以保存前导 0 吗?

我想做的是,对于一串巨大的位,我将转换为 8 位和 8 位,然后转换为 char,然后将其全部写入文件中。 稍后我想读取文件,获取 char,使用 ord(),获取 int,然后是我输入的位,前导 0。

我不确定你的用例是什么,但下面的内容几乎可以满足你的需求

实施

def weird_format(n):
    if not int(n, 2): return n
    return "{{:0{}}}".format(len(n) - len(n.lstrip('0')) + 1).format(int(n,2))

输出

>>> weird_format('000001')
'000001'
>>> weird_format('000101')
'0005'
>>> weird_format('11')
'3'
>>> weird_format('0000')
'0000'

您可以通过查找 1 的第一个索引(因为它是二进制字符串)来保留初始零的数量。

>>> s = '0000001'
>>> '{}{}'.format('0'*s.index('1'),int(s,2))
'0000001'
>>> s = '0000011'
>>> '{}{}'.format('0'*s.index('1'),int(s,2))
'000003'

如您所见,仅保留前导零而不保留位数。

另一个实现(只包括零)

>>> def change(s):
...      try:
...           return '{}{}'.format('0'*s.index('1'),int(s,2))
...      except ValueError:
...           return s
... 
>>> change('000000')
'000000'
>>> change('000001')
'000001'
>>> change('000011')
'00003'

针对您的问题的面向 OOP 的解决方案可能是创建一个 Binary class 来存储有关前导零的信息。

class Binary(object):

    def __init__(self, strval):
        object.__init__(self)
        self._leading_zeroes = 0
        self._int_repr = 0
        self._str_val = strval
        self._toBinary()

    def _toBinary(self):
        for c in self._str_val:
            if c=='0': self._leading_zeroes += 1
            else: break

        try: self._int_repr = int(self._str_val,2)
        except ValueError as e: raise e

    def GetLeadingZeroes(self):
        return ''.join(['0' for i in xrange(self._leading_zeroes)])

    def GetIntRepr(self):
        return self._int_repr

    def __repr__(self):
        return self.__unicode__()

    def __str__(self):
        return '%s%s' % (self.GetLeadingZeroes(), '' if self.GetIntRepr()==0 else '{0:b}'.format(self.GetIntRepr()))

    def __unicode__(self):
        return unicode(self.__str__())

if __name__ == '__main__':
    b0 = Binary('000001')
    b1 = Binary('000000')
    b2 = Binary('001001')
    print b0, b1, b2

#output: 0000001 0000000 0001001

然后,如果需要对Binary对象进行操作。您可以简单地重载二进制 class.

的运算符