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.
任何想法将不胜感激!
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)