#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 с поиском и конкретными значениями смещения, известными только создателю этого кода.