سؤال

ويمكن للشخص أن يقدم بعض الضوء على كيفية القيام بذلك؟ أستطيع أن أفعل ذلك لنص عادي أو صفيف بايت، ولكن غير متأكد من كيفية الاقتراب لقوات الدفاع الشعبي. هل أنا الأشياء الشعبي إلى صفيف بايت أولا؟

هل كانت مفيدة؟

المحلول

File.ReadAllBytes لتحميل PDF ملف، ومن ثم ترميز صفيف بايت كالمعتاد باستخدام Convert.ToBase64String(bytes) .

نصائح أخرى

وهناك الطريقة التي يمكنك القيام بذلك في قطع بحيث لم يكن لديك لحرق طن من الذاكرة في كل مرة.

وصافي يتضمن التشفير التي يمكن أن تفعل تجزئة معلومات، لكنه في نوع من مكان غريب. أنها تضعه في مساحة الاسم System.Security.Cryptography.

ولقد اختبرت رمز المثال أدناه، وأنا الحصول على إخراج متطابقة باستخدام بلدي أسلوب أو طريقة أندرو أعلاه.

إليك كيف يعمل: أنت النار حتى فئة تسمى CryptoStream. هذا هو نوع من محول يتم توصيله إلى مجرى آخر. قمت بتوصيل فئة تسمى CryptoTransform في CryptoStream (والذي بدوره يرد إلى ملف / الذاكرة / تيار الشبكة) ويقوم بإجراء عمليات تحويل البيانات على البيانات في حين انها قراءتها من أو كتابتها إلى الدفق.

وعادة، وتحول هو التشفير / فك التشفير، بل يشمل صافي ToBase64 وFromBase64 التحولات كذلك، لذلك نحن لن يتم تشفير، مجرد ترميز.

وهنا رمز. I شملت (ربما سيئة اسمه) تنفيذ اقتراح أندرو بحيث يمكنك مقارنة الإخراج.


    class Base64Encoder
    {
        public void Encode(string inFileName, string outFileName)
        {
            System.Security.Cryptography.ICryptoTransform transform = new System.Security.Cryptography.ToBase64Transform();
            using(System.IO.FileStream inFile = System.IO.File.OpenRead(inFileName),
                                      outFile = System.IO.File.Create(outFileName))
            using (System.Security.Cryptography.CryptoStream cryptStream = new System.Security.Cryptography.CryptoStream(outFile, transform, System.Security.Cryptography.CryptoStreamMode.Write))
            {
                // I'm going to use a 4k buffer, tune this as needed
                byte[] buffer = new byte[4096];
                int bytesRead;

                while ((bytesRead = inFile.Read(buffer, 0, buffer.Length)) > 0)
                    cryptStream.Write(buffer, 0, bytesRead);

                cryptStream.FlushFinalBlock();
            }
        }

        public void Decode(string inFileName, string outFileName)
        {
            System.Security.Cryptography.ICryptoTransform transform = new System.Security.Cryptography.FromBase64Transform();
            using (System.IO.FileStream inFile = System.IO.File.OpenRead(inFileName),
                                      outFile = System.IO.File.Create(outFileName))
            using (System.Security.Cryptography.CryptoStream cryptStream = new System.Security.Cryptography.CryptoStream(inFile, transform, System.Security.Cryptography.CryptoStreamMode.Read))
            {
                byte[] buffer = new byte[4096];
                int bytesRead;

                while ((bytesRead = cryptStream.Read(buffer, 0, buffer.Length)) > 0)
                    outFile.Write(buffer, 0, bytesRead);

                outFile.Flush();
            }
        }

        // this version of Encode pulls everything into memory at once
        // you can compare the output of my Encode method above to the output of this one
        // the output should be identical, but the crytostream version
        // will use way less memory on a large file than this version.
        public void MemoryEncode(string inFileName, string outFileName)
        {
            byte[] bytes = System.IO.File.ReadAllBytes(inFileName);
            System.IO.File.WriteAllText(outFileName, System.Convert.ToBase64String(bytes));
        }
    }

وأنا أيضا يلعب مع حولها حيث I إرفاق CryptoStream. في طريقة تشفير، وأنا إرفاقه (الكتابة) دفق إخراج، لذلك عندما المثال CryptoStream، وأنا استخدم منهجه كتابة ().

وعندما قرأت، وأنا إرفاقه (القراءة) تدفق الدخل، ولذا فإنني استخدام طريقة القراءة على CryptoStream. فإنه لا يهم حقا التي تيار I إرفاقه. لدي فقط لتمرير القراءة المناسبة أو كتابة عضو التعداد إلى منشئ CryptoStream ل.

scroll top