Добрый день!
Во флеше есть возможность преобразования объекта как массива байтов и потом любого издевательства над этими байтами и массивом ( как-то +\- любого числа к байту )
Пытаюсь похожую проблему решить на python, то есть прочитать файл побайтово, отнять от байта его позицию ( да-да, звучит бредово, но как-то работает на флэше )
Чего-то похожего удалось добиться через f = open('ac.swf', 'rb+')
ff = open('aaaa.swf', 'wb+')
data = f.read()
for i,el in enumerate(data):
el = unpack('<b', el)
ff.write(pack('i', el[0]-i))
Но в файл записываются лишние 3 ноля… Не знаю что сделать((
> В массиве около 1000 байт, соответственно, при выполнении этой магии с el[0]-i случается тоже магия, если запаковывать снова в байт, оно отваливается(
В одном предложении две магии. Фантастика.
> Товарищ avalak, если все просто и тривиально, скажите мне, пожалуйста, как вы сохраните в байте, а потом запишите в файл значение 123 — 500 ?)
Нет, это с чего Вы решили что 123 — 500 = -377 можно уместить в одном байте?
b — signed char (от -128 до 127). 1 байт.
i — int. 4 байта.
Что происходит у Вас в коде? Читаем файл по байтам, затем, фактически, из типа signed char/byte вычитаем int/long (пока это происходит в python проблем нет тк нет строгой типизации) и пытаемся упаковать в signed char/byte.
Рано или поздно ловим ожидаемое
struct.error: byte format requires -128 <= number <= 127
и называем это «магией». Упаковать в байт не получилось и вы пакуете в int (а он занимает 4 байта (то есть исходный байт + ещё 3 (вот они, те самые «3 ноля»))).
В чём проблема то? Что тут непонятного? Где здесь магия?
Выше сказали верно — упаковываете не то что распаковали.
Если файл небольшой, то удобнее наверно сразу считать его в массив, обработать, а потом массив записать.
Например так:
data = file('ac.swf','rb').read()
bytearr = unpack('<%db'%len(data), data)
# Process array bytearr: enumerate(bytearr)...
file('aaaa.swf','wb').write(pack('<%db'%len(bytearr), bytearr))