我正在尝试将字符串转换为二进制并进行补码,然后再次显示字符串。我看过几篇相关的文章,例如here和here,并且我正在跟踪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)
将其转换为二进制后是否有办法补充它并再次显示字符串?
答案 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)