2011-12-02 7 views
5

मैं बहुत ही सरल लेकिन परेशान करने वाली समस्या से फंस गया हूं, और इंटरनेट पर जवाब नहीं मिल रहा है। आशा है कि आप मुझे इंगित करने में सक्षम होंगे, मैंने क्या गलत किया है।गिट ऑब्जेक्ट्स डीकोडिंग/"ब्लॉक लम्बाई इसके पूरक के साथ मेल नहीं खाती" त्रुटि

मैं गिट भंडार से ऑब्जेक्ट को डीकोड करने का प्रयास कर रहा हूं। ProGit के अनुसार, फ़ाइल नाम और इसकी सामग्री को प्रतिबद्ध के दौरान डिफ्लेट किया गया है।

मैं एक धारा में 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); रनटाइम त्रुटि तक पहुँच जाता है तब होता है: ब्लॉक लंबाई इसके पूरक के साथ मेल नहीं खाता।

ऐसा क्यों?

फ़ाइल की सामग्री के बारे में मैं पढ़ने की कोशिश कर रहा हूं ... यह बाइनरी है और इसे गिट निष्पादन योग्य द्वारा बनाया गया था। मूल फ़ाइल नाम testfile.txt है, इसकी सामग्री Sample text. है SHA1 51d0be227ecdc0039698122a1513421ce35c1dbe है।

किसी भी विचार की सराहना की जाएगी!

उत्तर

7

DeflateStream और zlib दो अलग बातें के रूप में this answer में विस्तार से बताया है:

.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); 
} 
+0

धन्यवाद, यह वास्तव में सहायक था! – shytikov

2

zlib एक अतिरिक्त दो बाइट हैडर, एक वैकल्पिक "शब्दकोश" और अंत में एक चार बाइट checksum साथ Deflate है। आपके आवेदन के आधार पर - जैसे कि यदि आप जानते हैं कि कोई शब्दकोश नहीं होने वाला है - तो आप DeflateStream के माध्यम से इसे चलाने से पहले डेटा से पहले दो बाइट्स और अंतिम चार बाइट्स को बंद करने में सक्षम हो सकते हैं। यह एक गंदा समाधान है, लेकिन बाहरी निर्भरता लाने से आपको बचा सकता है।

संबंधित मुद्दे

 संबंधित मुद्दे