преобразовать строку в двоичный файл и взять дополнение - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь преобразовать строку в двоичный файл и взять дополнение, после чего снова отобразить строку. Я видел пары связанных постов, таких как здесь и здесь , и я слежу за официальной работой, которая была опубликована в здесь , в приведенном ниже кодепосле запуска кода отображается ошибка AttributeError: у объекта 'bytes' нет атрибута 'encode' . я использую 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 голосов
/ 08 ноября 2019

Если поддержки 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)
0 голосов
/ 08 ноября 2019

Мне кажется, что вы могли бы сделать это проще:

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)
0 голосов
/ 08 ноября 2019

Нет необходимости конвертировать вашу строку в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...