将字符串转换为二进制并取一个补码

时间:2019-11-08 14:37:25

标签: python python-3.x

我正在尝试将字符串转换为二进制并进行补码,然后再次显示字符串。我看过几篇相关的文章,例如herehere,并且我正在跟踪here中发布的正式工作,在运行以下代码后,在下面的代码中错误 AttributeError:“字节”对象没有属性“编码” 。我正在使用python 3.6

下面的代码是:

import binascii

def text_to_bits(text, encoding='utf-8', errors='surrogatepass'):
    bits = bin(int(binascii.hexlify(text.encode(encoding, errors)), 16))[2:]
    return bits.zfill(8 * ((len(bits) + 7) // 8))

def text_from_bits(bits, encoding='utf-8', errors='surrogatepass'):
    n = int(bits, 2)
    return int2bytes(n).decode(encoding, errors)

def int2bytes(i):
    hex_string = '%x' % i
    n = len(hex_string)
    return binascii.unhexlify(hex_string.zfill(n + (n & 1)))
your_string='hello'
b=your_string.encode('ascii', 'strict')
text_to_bits(b)

将其转换为二进制后是否有办法补充它并再次显示字符串?

3 个答案:

答案 0 :(得分:0)

无需将字符串转换为unicode(编码)。 您的功能运作良好。 看下面的代码:

your_string='hello'
#b=your_string.encode('ascii', 'strict')
b = text_to_bits(your_string)
print(b)
t = text_from_bits(b)
print(t)

结果:

0110100001100101011011000110110001101111
hello

答案 1 :(得分:0)

如果仅支持ASCII,就可以这样做:

a="Hello World!"
b="".join(bin(ord(x)^255)[2:] for x in a)
print(b)
c="".join(chr(int(b[x:x+8],2)^255) for x in range(0,len(b),8))
print(c)
101101111001101010010011100100111001000011011111101010001001000010001101100100111001101111011110
     

Hello World!

由于ASCII码低于128,所以someASCII ^ 255(补码)将始终是8位数字(最高有效位被设置)。 bin()加上0b前缀,这就是[2:]摆脱的前缀。

如果您需要通用字节,则必须应用一些填充魔术,例如

b="".join(("0000000"+bin(ord(x))[2:])[-8:] for x in a)

答案 2 :(得分:0)

我觉得您可以更轻松地做到这一点:

st = "hello world"
my_binary = ' '.join(format(ord(x), 'b') for x in st)
print(my_binary)

original = ''.join(chr(int(X[:8], 2)) for X in my_binary.split())
print(original)

参考文献:

然后只需对字符串进行二进制补全,例如:

def binary_str_twos(bin_str):
    twos = []
    first_one = True
    # twos compliment
    for char in reversed(bin_str):
        if char == ' ':
            twos.append(char)
        elif char == '1':
            twos.append('1' if first_one else '0')
            if first_one:
                first_one = False
        else:
            twos.append('0' if first_one else '1')

    return ''.join(reversed(twos))

请注意,这并不像仅使用二进制文件那样有效。

-编辑- 在没有空格的8位二进制文​​件中工作:

st = "hello world"
my_binary = ''.join(format(ord(x), '08b') for x in st)
print(my_binary)

original = ''.join(chr(int(my_binary[i:i+8], 2)) for i in range(0, len(my_binary), 8))
print(original)