如何检测zstd压缩?

3
我目前正在开发一个使用Facebook API的Python应用程序。众所周知,Facebook喜欢自己的技术,并且正在使用Zstd进行数据压缩。
问题在于:Facebook返回的要么是未压缩的普通JSON响应,要么是经过Zstd压缩的JSON响应(如果响应较长)。
我的当前代码类似于以下内容:
import zstd
import json


def handle_response(response)
    json = None
    try:
        json = json.loads(zstd.decompress(response.content))
    except:
        json = json.loads(response.text)

    return json

我目前在思考是否有更简洁的方法来处理这个问题,甚至能够检测zstd。


3
如果您将裸的except替换为某些特定类型的异常,那么您将拥有更加“干净”的代码。 - martineau
1
压缩数据将具有称为幻数的文件签名,以标识其。有一份描述格式的文档,并提供zstd幻数。有在Python中检查幻数的方法 - Alex
2个回答

7

你所做的是正确的。

你可以尝试检查流是否以四个字节 28 b5 2f fd 开头。如果不是,那么它不是一个 zstd 流。如果是,则可能 是一个 zstd 流。在后一种情况下,您将尝试解压缩,如果失败,您将回退到仅复制输入。

这实际上与你已经在做的完全相同,因为 zstd.decompress 做的第一件事就是寻找这个标志。


基本上: request.content.startswith(b"\x28\xb5\x2f\xfd") 谢谢! :) - mynameisgod
1
只需按照您在问题中提出的方案进行操作即可。 - Mark Adler

0
执行Python语句“b = zstd.compress(str)”后,字节数组总是以“b”(\xb5/\xfd \x03\x19\x00)开头。因此,您可以使用“index()”函数进行判断。
------------------ 有人知道如何在使用互联网浏览器时解压缩HTTP响应输出类型为“application/zstd”的内容吗? 像下面这样:
cache-control: no-store
cf-cache-status: DYNAMIC
cf-ray: 7a51c7dbad5efb2c-SJC
content-length: 1591
content-type: application/zstd
date: Thu, 09 Mar 2023 07:59:49 GMT
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800} report-to: {"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v3?s=K3U4RKcx6XOP1ekNoJGTilOIZ%2FR4f43q%2BBsvbmmbEkQFHWMJQ5JvhDFDbZFHqVczdsR0rzY24pO9h4kjeehrn3fs0H76%2FO2F612s%2F7%2FjQ%2F6LRjYIb%2BOsPsFOEzIzJTU0NwSyUEmTPW0%3D"}],"group":"cf-nel","max_age":604800}
server: cloudflare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接