LZMA Returns 不支持输入格式
LZMA Returns Input Format not supported
似乎当我尝试解码一些从 base 64 解码的字节时,它给出了 Input Format not Supported
。我无法隔离这个问题,因为当我将解码后的逻辑单独放入一个新文件时,错误不会发生,让我认为这与 flask 将参数传递给函数的方式有关。
代码:
from flask import Flask
import base64
import lzma
from urllib.parse import quote, unquote
app = Flask('app')
@app.route('/')
def hello_world():
return 'Hello, World!<br><button onclick = "var base = \'https://Text-Viewer-from-Bsace-64-URL.inyourface3445.repl.co/encode\';location.href = `${base}/${prompt(\'What do you want to send?\')}`" >Use</button>'
newline = '/n'
@app.route('/view/<path:b64>')
def viewer(b64):
print(type(b64))
s1 = base64.b64decode(b64.encode() + b'==')
s2 = lzma.decompress(s1).decode()
s3 = unquote(s2).replace(newline, '<br>')
return f'<div style="overflow-x: auto;">{s3}</div>'
@app.route('/encode/<path:txt>')
def encode(txt):
quote_text = quote(txt, safe = "")
compressed_text = lzma.compress(quote_text.encode())
base_64_txt = base64.b64encode(compressed_text).decode()
return f'<a href = "https://Text-Viewer-from-Bsace-64-URL.inyourface3445.repl.co/view/{base_64_txt}">text link </a>'
app.run(host='0.0.0.0', port=8080, debug=True)
谁能解释一下我做错了什么?
您正在传递 base64 编码的字符串作为 URL 的一部分,并且该字符串可能包含在此过程中被破坏的字符。
例如,访问 /encode/hello
将得到以下内容 URL:
https://text-viewer-from-bsace-64-url.inyourface3445.repl.co/view//Td6WFoAAATm1rRGAgAhARYAAAB0L+WjAQAEaGVsbG8AAAAAsTe52+XaHpsAAR0FuC2Arx+2830BAAAAAARZWg==
几个字符可能出错:
- 第一个字符是
/
,因此 Flask 将从 view//TD6...
重定向到 view/TD6...
:换句话说,第一个字符被删除
- 根据浏览器执行 URL-encoding 和 Flask 执行 URL-decoding 的方式,
+
字符可能会被解码为 space
为了避免这些问题,我建议使用 base64.urlsafe_b64encode
/ base64.urlsafe_b64decode
,它们是 base64 编码的版本,输出可以在 URL 中使用而不会被破坏。
对您的代码进行以下更改似乎可以解决问题:
s1 = base64.urlsafe_b64decode(b64.encode())
在 viewer
base_64_txt = base64.urlsafe_b64encode(compressed_text).decode()
在 encode
似乎当我尝试解码一些从 base 64 解码的字节时,它给出了 Input Format not Supported
。我无法隔离这个问题,因为当我将解码后的逻辑单独放入一个新文件时,错误不会发生,让我认为这与 flask 将参数传递给函数的方式有关。
代码:
from flask import Flask
import base64
import lzma
from urllib.parse import quote, unquote
app = Flask('app')
@app.route('/')
def hello_world():
return 'Hello, World!<br><button onclick = "var base = \'https://Text-Viewer-from-Bsace-64-URL.inyourface3445.repl.co/encode\';location.href = `${base}/${prompt(\'What do you want to send?\')}`" >Use</button>'
newline = '/n'
@app.route('/view/<path:b64>')
def viewer(b64):
print(type(b64))
s1 = base64.b64decode(b64.encode() + b'==')
s2 = lzma.decompress(s1).decode()
s3 = unquote(s2).replace(newline, '<br>')
return f'<div style="overflow-x: auto;">{s3}</div>'
@app.route('/encode/<path:txt>')
def encode(txt):
quote_text = quote(txt, safe = "")
compressed_text = lzma.compress(quote_text.encode())
base_64_txt = base64.b64encode(compressed_text).decode()
return f'<a href = "https://Text-Viewer-from-Bsace-64-URL.inyourface3445.repl.co/view/{base_64_txt}">text link </a>'
app.run(host='0.0.0.0', port=8080, debug=True)
谁能解释一下我做错了什么?
您正在传递 base64 编码的字符串作为 URL 的一部分,并且该字符串可能包含在此过程中被破坏的字符。
例如,访问 /encode/hello
将得到以下内容 URL:
https://text-viewer-from-bsace-64-url.inyourface3445.repl.co/view//Td6WFoAAATm1rRGAgAhARYAAAB0L+WjAQAEaGVsbG8AAAAAsTe52+XaHpsAAR0FuC2Arx+2830BAAAAAARZWg==
几个字符可能出错:
- 第一个字符是
/
,因此 Flask 将从view//TD6...
重定向到view/TD6...
:换句话说,第一个字符被删除 - 根据浏览器执行 URL-encoding 和 Flask 执行 URL-decoding 的方式,
+
字符可能会被解码为 space
为了避免这些问题,我建议使用 base64.urlsafe_b64encode
/ base64.urlsafe_b64decode
,它们是 base64 编码的版本,输出可以在 URL 中使用而不会被破坏。
对您的代码进行以下更改似乎可以解决问题:
s1 = base64.urlsafe_b64decode(b64.encode())
在viewer
base_64_txt = base64.urlsafe_b64encode(compressed_text).decode()
在encode