При работе с бинарными данными вам нужно как можно больше стараться оставаться в бинарном режиме, тем более что нет гарантии, что выбранная вами кодировка строки в любом случае может представлять все значения.
Просто помните, что bytes
объекты в основном представляют собой списки 8-битных целых чисел без знака, даже если они имеют удобный строковой синтаксис b'xyz'
.
filein = "download.jpeg"
fileout = "glitch.jpg"
with open(filein, "rb") as rd:
img = rd.read()
# We can happily crash here if there's no FFDA;
# that means we're not able to process the file anyway
prelude, marker, scanimg = img.partition(b"\xff\xda")
scanglitch = []
for letter in scanimg: # scanimg is a list of integers, so we have to use `ord()`
if letter != ord("a"):
scanglitch.append(letter)
else:
scanglitch.append(ord("e"))
with open(fileout, "wb") as wr:
wr.write(prelude)
wr.write(marker)
wr.write(bytes(scanglitch))
(Я знаю, что логика замены может быть написана как понимание списка, но я подумал, что это будет более дружелюбно, как это.)
Мне не известны какие-либо инструменты, которые будут делать это автоматически, но процесс заключается в создании проекта DLL и добавлении ваших библиотек в проект. Для каждой функции в заголовочном файле:
int SomeLibFunc( int x, int y );
вам нужно будет создать и экспортировать свою собственную функцию в DLL;
int MyFunc( int x, int y ) {
return SomLibFunc( x, y );
}
Процесс довольно механический, и вы можете создать сценарий, используя что-то вроде perl для создания исходные файлы DLL.
Если у вас нет доступа к источнику, вы можете просто создать DLL-оболочку, которая экспортирует необходимые вам функции и делегирует их статической библиотеке.