从 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.
的运算符
有没有那个
>>> 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.
的运算符