python: error de manejo de archivos de Steganographer para archivos que no son de texto sin formato

He construidoun esteganógrafo de Python y estoy tratando de agregarle una GUI. Despuésmi pregunta anterior con respecto a la lectura de todo tipo de archivos en Python. Desde entonces, el steganographer solo puede codificar bytes en la imagen. Quiero agregar soporte para codificar directamente un archivo de cualquier extensión y codificarlo. Para esto, estoy leyendo el archivo en binario e intento codificarlo. Funciona bien para archivos que básicamente contienen texto sin formato UTF-8 porque puede codificar fácilmente.txt y.py archivos

Mi código actualizado es:

from PIL import Image

import os

class StringTooLongException(Exception):
    pass

class InvalidBitValueException(Exception):
    pass

def str2bin(message):       
    binary = bin(int.from_bytes(message, 'big'))
    return binary[2:]

def bin2str(binary):
    n = int(binary, 2)
    return n.to_bytes((n.bit_length() + 7) // 8, 'big')

def hide(filename, message, bits=2):
    image = Image.open(filename)
    binary = str2bin(message) + '00000000'

    if (len(binary)) % 8 != 0:
        binary = '0'*(8 - ((len(binary)) % 8)) + binary

    data = list(image.getdata())

    newData = []

    if len(data) * bits < len(binary):
        raise StringTooLongException

    if bits > 8:
        raise InvalidBitValueException

    index = 0
    for pixel in data:
        if index < len(binary):
            pixel = list(pixel)
            pixel[0] >>= bits
            pixel[0] <<= bits
            pixel[0] += int('0b' + binary[index:index+bits], 2)
            pixel = tuple(pixel)
            index += bits

        newData.append(pixel)

    image.putdata(newData)
    image.save(os.path.dirname(filename) + '/coded-'+os.path.basename(filename), 'PNG')

    return len(binary)

def unhide(filename, bits=2):
    image = Image.open(filename)
    data = image.getdata()

    if bits > 8:
        raise InvalidBitValueException

    binary = ''

    index = 0

    while not (len(binary) % 8 == 0 and binary[-8:] == '00000000'):
        value = '00000000' + bin(data[index][0])[2:]
        binary += value[-bits:]
        index += 1

    message = bin2str(binary)
    return message

Ahora, el problema viene cuando trato de esconderme.pdf o.docx archivos en el mismo. Están sucediendo varias cosas:

1) Microsoft Word o Adobe Acrobat muestra que el archivo está dañado.

2) El tamaño del archivo se reduce considerablemente de 40 KB a 3 KB, lo que es una clara señal de error.

Creo que la razón detrás de esto podría ser que el archivo contiene una lectura de caracteres NULL que mi programa no lee más. ¿Tienes alguna idea alternativa para ello?

Tengo una idea para cambiar el byte final, pero aún puede tener el mismo resultado que un archivo puede contener ese byte.

¡Gracias de nuevo!

Respuestas a la pregunta(1)

Su respuesta a la pregunta