Как записать байты из входных данных со смещениями в двоичный файл?

#python #binary #byte

#python #двоичный #байт

Вопрос:

Я пытаюсь создать файл bin со сценарием ниже, который должен записывать байты из пользовательского ввода и со смещенными байтами между каждым символом. Но есть проблема, когда он записывает последовательно все байты и не отделяется после каждого байта с добавленным байтом смещения, определенным с помощью ‘shift’.

введите описание изображения здесь

 offset is 2 bytes    p        y        t        h        o        n
00000000 00000000 00110001 00110001 00110001 00110000 00110000 00110000 00110000 00000000 00000000 00000000
  

Как я хочу, чтобы это было

 offset 2 bytes      p      offset 2 bytes      y      offset 2 bytes        t    offset 2 bytes , etc
00000000 00000000 00110001 00000000 00000000 00110001 00000000 00000000 00110001 00000000 00000000 00110000 00000000 00000000 00110000 00000000 00000000 00110000 00000000 00000000 00110000 00000000 0000000
  

Вот код для программы

 fdata = open("text.bin","wb")
fmeta = open("key.bin","w b")
print('Enter text:')
txt='python' # input()
l=len(txt)
print(l, 'bytes')
strtobin= ' '.join(format(x, 'b') for x in bytearray(txt, 'utf-8'))
print(strtobin)

# even bytes in key [xor 1]
for v in range(0, 25, 2):
    #print(v)
    fmeta.seek(v)
    fmeta.write(bytes(0))

shift=int(2)
sh=shift.to_bytes(1, byteorder='big')
# odd bytes in key 
for a in range(1,25):
    if a % 2 != 0:
        #print(a)
        fmeta.seek(a)
        fmeta.write(sh)

# text bin [xor 2]
pos=0
#for i in range(1,10): #(len(txt) 10)
for elem in strtobin.split():
    el1=elem.encode('ascii')
    print (el1)
    #print(elem)
    pos = pos   sh
    fdata.seek(pos,1)
    fdata.write(el1)
  

Ответ №1:

вы могли бы сделать что-то вроде этого:

 from pathlib import Path

PAD = b'x000'

with Path("in.txt").open("r") as infile, Path("out.bin").open("wb") as  out_file:
    for line in infile:
        for char in line:
            out_file.write(PAD)
            out_file.write(char.encode())
     out_file.write(PAD)
  

просто пишите PAD после каждого символа и в самом конце файла.

if "in.txt" просто состоит из строки "python" , которая должна более или менее воспроизводить желаемый результат.

Ответ №2:

Возможно, я неправильно понимаю, что вы пытаетесь сделать, но ваш код выглядит ужасно сложным для того, что он пытается сделать.

Почему бы просто

 for ch in text:
     <Not sure if you want to write 2 0's or skip two bytes>
     Write ch as a byte
  

Пропуск двух байтов file.seek(2, 1)

Комментарии:

1. Я хотел пропустить два байта после каждого байта (для символа), чтобы позже я мог прочитать эти файлы bin с поиском и конкретными значениями смещения, известными только создателю этого кода.