解码git对象/"块长度与其补码不匹配"错误

shy*_*kov 5 c# git dvcs low-level

我遇到了非常简单但烦人的问题,并且无法在互联网上找到答案.希望你能指出我,我做错了什么.

我正在尝试从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;
}
Run Code Online (Sandbox Code Playgroud)

gs.CopyTo(ms);达到出现运行时错误:块长度不匹配它的补充.

为什么这样?

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

任何想法将不胜感激!

Dar*_*rov 7

DeflateStream并且zlib这个答案中解释的两个不同的东西:

.NET基类库中没有ZlibStream - 没有任何产生或消耗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);
}
Run Code Online (Sandbox Code Playgroud)