gpt4 book ai didi

c# - 解码 git 对象/"Block length does not match with its complement"错误

转载 作者:太空狗 更新时间:2023-10-29 13:18:52 27 4
gpt4 key购买 nike

我被一个非常简单但烦人的问题困住了,无法在 Internet 上找到答案。希望您能指出我做错了什么。

我正在尝试解码 Git 存储库中的对象。根据ProGit ,文件名及其内容在提交期间已缩小。

我正在使用 C# 将 SHA1 指示的对象读取到流中,将其扩充并转换为字节数组。这是代码:

using System.IO.Compression;

static internal byte[] GetObjectBySha(string storagePath, string sha)
{
string filePath = Path.Combine(storagePath, "objects", sha.Substring(0, 2), sha.Substring(2, 38));
byte[] fileContent = null;

using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
using (MemoryStream ms = new MemoryStream())
{
using (DeflateStream gs = new DeflateStream(fs, CompressionMode.Decompress))
{
gs.CopyTo(ms);
}

fileContent = ms.ToArray();
}
}

return fileContent;
}

当到达 gs.CopyTo(ms); 时发生运行时错误: block 长度与其补码不匹配。

为什么会这样?

关于我正在尝试读取的文件的内容...它是二进制文件,由 git 可执行文件创建。原始文件名为testfile.txt,内容为Sample text. SHA1为51d0be227ecdc0039698122a1513421ce35c1dbe

任何想法将不胜感激!

最佳答案

DeflateStreamzlib 是两个不同的东西,如 this answer 中所述。 :

There is no ZlibStream in the .NET base class library - nothing that produces or consumes ZLIB

所以您需要的是 ZLIB 消费者。 DotNetZip图书馆提供了一个:

static internal byte[] GetObjectBySha(string storagePath, string sha)
{
string filePath = Path.Combine(storagePath, "objects", sha.Substring(0, 2), sha.Substring(2, 38));
byte[] compressed = File.ReadAllBytes(filePath);
return Ionic.Zlib.ZlibStream.UncompressBuffer(compressed);
}

关于c# - 解码 git 对象/"Block length does not match with its complement"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8354811/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com