मूल रूप से मेरे पास कई मशीनों से डेटा के एक समूह के साथ एक एन्क्रिप्टेड .csv फ़ाइल है। एन्क्रिप्शन वास्तव में सरल है, प्रत्येक वर्ण का ASCII मान 128 जोड़ा जाता है और फ़ाइल एक्सटेंशन को .csv से .dlg में बदल दिया जाता है। मेरा प्रश्न है: इस फ़ाइल को वापस सामान्य .csv फ़ाइल में कैसे बदलें? यहां मैंने पहले ही कोशिश की है:

string str1 = File.ReadAllText(@"C:\0328.dlg", Encoding.Default);
string str2 = "";
for (int i = 0; i <= 100000; i++)
{
    str2 += (char)(str1[i] - (char)128);
}

मुख्य समस्या यह है कि फ़ाइल वास्तव में बड़ी है, इसमें लगभग 13 मिलियन वर्ण हैं। उपरोक्त समाधान "काम करता है", लेकिन फ़ाइल को पूरी तरह से डिक्रिप्ट करने में शायद लगभग 20 मिनट लगेंगे, जबकि मैं इसे कुछ सेकंड में करना चाहता हूं। क्या इसे करने का कोई तरीका है?

0
Log Dog 20 अगस्त 2019, 16:01

2 जवाब

सबसे बढ़िया उत्तर

LINQ को आज़माएं:

string str2 = new string(str1.Select(c => (char)(c - 128)).ToArray());
1
Youssef13 20 अगस्त 2019, 16:16

मैं इस समाधान का सुझाव दूंगा:

using (var source = new FileStream("some.dlg", FileMode.Open)){
    using (var target = new FileStream("some.csv", FileMode.Create))
    {
        byte[] buffer = new byte[1024];
        byte mask = 0x80;

        while(true) 
        {
            var count = await source.ReadAsync(buffer, 0, 1024);

            if (count == 0)
                break;

            for (int i = 0; i < count; i++) 
                buffer[i] = (byte)(buffer[i] ^ mask);

            await target.WriteAsync(buffer, 0, count);
        }
    }
}

FileStream के उपयोग से आप अपनी मेमोरी को अधिक प्रभावी ढंग से उपयोग कर सकते हैं जैसे कि पूरी फ़ाइल को एक बार में पढ़ने के लिए।

1
Ackdari 20 अगस्त 2019, 16:27