小编Can*_*pus的帖子

在 WebExtensions(JavaScript、Firefox)中读取 LZ4 压缩文本文件(mozlz4)

我正在将 Firefox Add-on SDK 扩展移植到 WebExtensions。以前我可以访问浏览器的搜索引擎,但现在我不能,所以一位乐于助人的用户建议我尝试阅读 search.json.mozlz4 文件,该文件包含每个已安装的引擎。然而,这个文件是带有 LZ4 压缩的 json,它是 Mozilla自己的 LZ4 格式,带有一个自定义的幻数,'mozLz40\0'。

以前,可以使用它来读取使用 LZ4 压缩的文本文件,包括 mozlz4 文件:

let bytes = OS.File.read(path, { compression: "lz4" });
let content = new TextDecoder().decode(bytes);
Run Code Online (Sandbox Code Playgroud)

(虽然我找不到有关“压缩”字段的文档,但它有效)

现在,使用 WebExtensions,我能想到的最好的读取文件是

var reader = new FileReader();
reader.readAsText(file);
reader.onload = function(ev) {
    let content = ev.target.result;
};
Run Code Online (Sandbox Code Playgroud)

这不会以任何方式处理压缩。这个库处理 LZ4 ,但它用于 node.js 所以我不能使用它。[编辑:它也可以独立工作]。但是,即使我删除了自定义幻数处理,我也无法解压缩文件,而相比之下,此 Python 代码按预期工作:

import lz4
file_obj = open("search.json.mozlz4", "rb")
if file_obj.read(8) != b"mozLz40\0":
    raise InvalidHeader("Invalid magic number")
print(lz4.block.decompress(file_obj.read()))
Run Code Online (Sandbox Code Playgroud)

我怎样才能在 JS 中做到这一点?

javascript file lz4 firefox-addon-webextensions

3
推荐指数
1
解决办法
3224
查看次数

接收List <T>的C#泛型方法不会为实际类型的T调用重载方法(更喜欢通用类型)

我有这个例子C#代码:

class Stuff { }  // empty class

void Main()
{
    var list = new List<Stuff> {
        new Stuff(),
        new Stuff()
    };
    Fun(list);
}

void Fun<T>(List<T> a)
{
    Debug.Log("called List<T> Fun");
    foreach (T t in a) {
        Fun(t);
    }
}

void Fun(Stuff a)
{
    Debug.Log("called Stuff Fun");
}

void Fun<T>(T a)
{
    Debug.Log("called T Fun");
}
Run Code Online (Sandbox Code Playgroud)

调用Main()最终打印:

called List<T> Fun
called T Fun
called T Fun
Run Code Online (Sandbox Code Playgroud)

我不明白为什么编译器能够Fun<T>(List<T> a)按预期调用,但后来不知道调用Fun(Stuff a),哪个更具体Fun<T>(T a).在编译时是否确定T Stuff在这种情况下是肯定的?typeof(T)内部打印 …

c# generics overloading

3
推荐指数
1
解决办法
196
查看次数