for key in fnt.keys():
str1 = base64.b64decode(fnt[key])
strA = XOR(str1, coder)
temp = tempfile.TemporaryFile()
temp.seek(0)
temp.write(strA)
temp.seek(0)
if key == "calibri.ttf":
FONT = temp
if key == "calibrib.ttf":
FONTB = temp
temp.close()
return (FONT, FONTB)
在上面的代码中,我检索了在字典中保存为字符串的字体。当我使用此代码时,它返回一个错误 - RuntimeError:无法在流中搜索。 使用下面的代码,它完美地工作。有人请解释如何使用临时文件方法获取字体而不是写入文件。这可能吗?
for key in fnt.keys():
str1 = base64.b64decode(fnt[key])
strA = XOR(str1, coder)
with open(home + "\\" + key, "wb") as to_disk:
to_disk.write(strA)
FONT = "calibri.ttf"
FONTB = "calibrib.ttf"
return (FONT, FONTB)
我正在添加以下完整代码。看看这是否有助于给我一个可行的答案。
import string
import base64
import os
from fnt import fnt
import string
import tempfile
from itertools import cycle, izip
def XOR(message, key):
cryptedMessage = ''.join(chr(ord(c)^ord(k)) for c,k in izip(message, cycle(key)))
return cryptedMessage
#----------------------------------------------------------------------
def main():
"""extracts and returns the font files from fnt.py"""
coder ="PHdzDER+@k7pcm!LX8gufh=y9A^UaMsn-oW6"
home = os.getcwd()
for key in fnt.keys():
str1 = base64.b64decode(fnt[key])
strA = XOR(str1, coder)
#temp = tempfile.TemporaryFile()
#temp.seek(0)
#temp.write(strA)
#temp.seek(0)
#if key == "calibri.ttf":
#FONT = temp
#if key == "calibrib.ttf":
#FONTB = temp
with open(home + "\\" + key, "wb") as to_disk:
to_disk.write(strA)
FONT = "calibri.ttf"
FONTB = "calibrib.ttf"
return (FONT, FONTB)
if __name__=='__main__':
main()
答案 0 :(得分:2)
当临时关闭时,它会被销毁,因此您无法从中读取以提取字体数据。
您的代码在哪一行得到RuntimeError: Can't seek in stream
错误消息?正如Michael Petch所说,我们需要了解您的操作系统。 tempfile.TemporaryFile()当然可以在Linux上搜索。
BTW,
if key == "calibrib.ttf":
FONTB = temp
temp.close()
temp.close()
位于if
区块内。我猜这可能只是一个副本&粘贴错误。但正如我上面所说,你不想要关闭这些文件,直到你从中读取它们为止。
据推测,您的原始字体读取功能会使用文件名从磁盘打开字体文件,然后使用open()
中的文件句柄访问字体数据。正如Michael Petch所说,你需要改变它以接受已经打开的文件的句柄。
当你说'#34;没有其他字体阅读功能"之前我感到很困惑,因为我无法弄清楚你实际上是想用解密的字体数据做什么。
我想我也因为调用字体提取函数main()
而感到困惑,因为main()通常用作程序的入口点,所以程序通常不会运行在不同的模块中有许多不同的main()
函数。
总之...
我从未使用过pygame,但是通过快速查看the docs,你可以给pygame.font.Font()
一个字体名称字符串或一个打开的字体文件句柄作为第一个arg,例如
myfont = pygame.font.Font(font_filehandle, size)
据推测,您的fnt
模块有一个包含两串base64编码,XOR加密字体数据的字典,由字体名称键入," calibrib.ttf"。
所以这个应该工作,假设我没有误解那个pygame doc。 :)
警告:未经测试的代码
def xor_str(message, key):
return ''.join([chr(ord(c)^ord(k)) for c,k in izip(message, cycle(key))])
def decode_fonts(fnt):
coder = "PHdzDER+@k7pcm!LX8gufh=y9A^UaMsn-oW6"
font_fh = {}
for key in fnt.keys():
xorfont = base64.b64decode(fnt[key])
temp = tempfile.TemporaryFile()
temp.write(xor_str(xorfont, coder))
temp.seek(0)
font_fh[key] = temp
return font_fh
#...............
#In your pygame function:
font_fh = decode_fonts(fnt)
font_obj = {}
for key in font_fh.keys():
font_obj[key] = pygame.font.Font(font_fh[key], point_size)
#Now you can do
surface = font_obj["calibri.ttf"].render(text, antialias, color, background=None)