бит манипуляции BMP python3 - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь получить текст, который скрыл внутри изображения BMP, но когда я хочу преобразовать его в ASCII, у меня появляется следующая ошибка: «UnicodeDecodeError: код« utf-8 »c может не декодировать байт 0x94 в позиции 1: недопустимый начальный байт ". Я не знаю, какое кодирование использовать, чтобы оно работало. Может быть, другой способ скрыть текст внутри файла BMP с помощью подстановки LSB (сделать преобразование непосредственно с байтами?)

Это мой код:

import binascii
import struct
from bitstring import BitArray


def str2bin(text, encoding='utf-8', errors='surrogatepass'):
    bits = bin(int.from_bytes(text.encode(encoding, errors), 'big'))[2:]         
    return bits.zfill(8 * ((len(bits) + 7) // 8)) # each ASCII character is 8 bits

def bin2str(text, encoding='utf-8', errors='surrogatepass'):
    n = int(text, 2)    
    return n.to_bytes((n.bit_length() + 7) // 8, 'big').decode(encoding,errors) or '\0'

def writeNewBMP(imageSource, textBuffer):
    inputImage = open(imageSource, 'rb')
    bufferInfo = inputImage.read()
    inputImage.close()
    headerOffset = 805
    j = -1
    bufferInfo = BitArray(bufferInfo).bin[1:]
    bufferTemp = list(bufferInfo)

    for i in range(headerOffset, len(bufferTemp), 7):
        if i < len(textBuffer):
            bufferTemp[i] = textBuffer[j]
            j += 1
    bufferTemp = "".join(bufferTemp)
    bufferTemp = int(bufferTemp, 2).to_bytes((len(bufferTemp) + 7) // 8, 'big')
    outputImage = open('Python/Assign05/embedded_image_LSB.bmp', 'wb')
    outputImage.write(bufferTemp)
    outputImage.close()

def extractFile(BMPFile):
    embeddedFile = open(BMPFile, 'rb')
    bufferBin = embeddedFile.read()
    embeddedFile.close()
    headerOffset = 805
    j = -1
    bufferBin = BitArray(bufferBin).bin[1:]
    bufferTemp = ""
    print(type(bufferBin))
    for i in range(headerOffset, len(bufferBin), 7):
        bufferTemp += bufferBin[i]
    fp_declaratfpDeclarationOfIndependantFromBit = open("Python/Assign05/test_return.txt", "a")
    fp_declaratfpDeclarationOfIndependantFromBit.write(bin2str(bufferTemp))
    fp_declaratfpDeclarationOfIndependantFromBit.close()



###################################
#   Transformation Text to Binary
###################################                                                                                        
fpDeclarationOfIndependant = open("Python/Assign05/Declaration_of_Independence.txt", "r")
# Store input text in a string buffer
bufferInputFile = fpDeclarationOfIndependant.read()
fpDeclarationOfIndependant.close()
# Transform text to binary
bufferInputFileBin = str2bin(bufferInputFile)

###################################
#   Open BMP file and LSB
###################################

writeNewBMP('Python/Assign05/ballons_rgb.bmp', bufferInputFileBin)

###################################
#   Transformation Binary to Text
###################################

extractFile('Python/Assign05/embedded_image_LSB.bmp')

Спасибо

...