2010-03-11 19 views
21

मैं ऐसी विधि बनाना चाहता हूं जो किसी भी फाइल को ले ले और इसे 0s और 1s की सरणी के रूप में पढ़ता है, यानी इसका बाइनरी कोड। मैं उस बाइनरी कोड को टेक्स्ट फ़ाइल के रूप में सहेजना चाहता हूं। क्या आप मेरी मदद कर सकते हैं? धन्यवाद।सी # में फ़ाइल बाइनरी कैसे पढ़ा जाए?

+0

आपका प्रश्न स्पष्ट नहीं है। दो फाइलों को वास्तव में क्या दिखाना चाहिए? – SLaks

+0

मुझे लगता है कि वह एक फ़ाइल के बिट पैटर्न को एक टेक्स्ट फ़ाइल में स्टोर करना चाहता है। – Oded

+0

क्या स्रोत फ़ाइल बाइनरी या एन्कोडेड है (टेक्स्टुअल, या तो ASCII, UTF-8, UTF-16, आदि)? दूसरे शब्दों में, यदि आप नोटपैड जैसे टेक्स्ट एडिटर में फ़ाइल खोलते हैं, तो क्या आप शून्य और किसी को देखते हैं? – Pat

उत्तर

40

त्वरित और गंदे संस्करण के साथ मुद्रित:

byte[] fileBytes = File.ReadAllBytes(inputFilename); 
StringBuilder sb = new StringBuilder(); 

foreach(byte b in fileBytes) 
{ 
    sb.Append(Convert.ToString(b, 2).PadLeft(8, '0')); 
} 

File.WriteAllText(outputFilename, sb.ToString()); 
+1

@ एंड्री: "त्वरित और गंदे" देखें। जाहिर है, उत्पादन में, फ़ाइल धाराओं का उपयोग करने वाला कुछ बेहतर होगा। महत्वपूर्ण हिस्सा बाइट्स से बाइनरी तारों में परिवर्तित हो रहा है। –

12

अच्छा, इसे पढ़ना मुश्किल नहीं है, बस बाइट [] पढ़ने के लिए फ़ाइलस्ट्रीम का उपयोग करें। इसे टेक्स्ट में कनवर्ट करना वास्तव में आम तौर पर संभव या सार्थक नहीं है जब तक कि आप 1 और 0 के हेक्स में कनवर्ट न करें। BitConverter.ToString (बाइट []) अधिभार के साथ करना आसान है। आप आम तौर पर प्रत्येक पंक्ति में 16 या 32 बाइट डंप करना चाहते हैं। बाइट्स को वर्णों में बदलने की कोशिश करने के लिए आप एन्कोडिंग.एएससीआईआई.गेटस्ट्रिंग() का उपयोग कर सकते हैं। एक नमूना प्रोग्राम है जो ऐसा करता है:

using System; 
using System.IO; 
using System.Text; 

class Program { 
    static void Main(string[] args) { 
     // Read the file into <bits> 
     var fs = new FileStream(@"c:\temp\test.bin", FileMode.Open); 
     var len = (int)fs.Length; 
     var bits = new byte[len]; 
     fs.Read(bits, 0, len); 
     // Dump 16 bytes per line 
     for (int ix = 0; ix < len; ix += 16) { 
      var cnt = Math.Min(16, len - ix); 
      var line = new byte[cnt]; 
      Array.Copy(bits, ix, line, 0, cnt); 
      // Write address + hex + ascii 
      Console.Write("{0:X6} ", ix); 
      Console.Write(BitConverter.ToString(line)); 
      Console.Write(" "); 
      // Convert non-ascii characters to . 
      for (int jx = 0; jx < cnt; ++jx) 
       if (line[jx] < 0x20 || line[jx] > 0x7f) line[jx] = (byte)'.'; 
      Console.WriteLine(Encoding.ASCII.GetString(line)); 
     } 
     Console.ReadLine(); 
    } 
} 
+0

आपके उत्तर के लिए धन्यवाद। हमम .. कुछ काम नहीं कर रहा है, क्योंकि मुझे 0s और 1s नहीं मिल रहा है। इसके बजाए, मुझे वही प्रभाव मिल रहा है जैसे कि मैं नोटपैड में एक फ़ाइल खोलना चाहता हूं। – Boris

+0

हाँ आप करते हैं, वे हेक्स में एन्कोड किए गए हैं। नोटपैड में आप वही बात नहीं देखेंगे। पृष्ठभूमि: http://en.wikipedia.org/wiki/Hexadecimal –

+0

यह विधि फ़ाइल को पढ़ती है, क्या आप एक विधि प्रदान कर सकते हैं जो फ़ाइल में बाइनरी लिखती है या फ़ाइल में बाइनरी डेटा लिखती है और फिर हेक्स में परिवर्तित होती है जिस तरह से आप यहाँ है? – shawn

4

आप BinaryReader उपयोग कर सकते हैं बाइट्स की प्रत्येक को पढ़ने के लिए है, तो BitConverter.ToString(byte[]) का उपयोग पता लगाने के लिए प्रत्येक बाइनरी में प्रतिनिधित्व किया है।

फिर आप इस प्रस्तुति का उपयोग कर सकते हैं और write इसे फ़ाइल में उपयोग कर सकते हैं।

+0

आपके उत्तर के लिए धन्यवाद। – Boris

3

उपयोग सरल FileStream.Read तो यह Convert.ToString(b, 2)

+0

आपके उत्तर के लिए धन्यवाद। – Boris

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