سؤال

وأواجه نوعا من مشكلة مع الترميز في بلدي ASP.NET HTTPHandler، الذي يرسل ملف. يتم تمرير محتوى الملف في شكل متغير مخفي من صفحة ويب كولد فيوجن التي تستخدم ما يسمى "ToBase64".

في كولد فيوجن، والرموز المستخدمة لوضع محتوى الملف إلى النموذج كما يلي:

<cffile action="readBinary" file="#FileName#" variable="objBinaryData">
    <cfset b64file = #toBase64(objBinaryData)#>
<form name="sendToHandler" 
           action="http://myserver/mysite/UploadHandler.ashx" method="post">
   <cfoutput>
       <input type="hidden" name="objBinaryData" value="#b64file#" />

وعندما يتم نشر بلدي UploadHandler.ashx، وأنا الحصول على سلسلة من النموذج كما يلي:

            string fileContent = context.Request.Form["objBinaryData"];

وبعد ذلك، أنا تحويل السلسلة إلى صفيف بايت كما يلي:

            byte[] binData = StringToByteArray(fileContent, EncodingType.ASCII);

وهنا هي وظيفة أنا باستخدام تحويل السلسلة:

        public static byte[] StringToByteArray(string str, EncodingType encodingType)
    {
        System.Text.Encoding encoding = null;
        switch (encodingType)
        {
            case EncodingType.ASCII:
                encoding = new System.Text.ASCIIEncoding();
                break;
            case EncodingType.Unicode:
                encoding = new System.Text.UnicodeEncoding();
                break;
            case EncodingType.UTF7:
                encoding = new System.Text.UTF7Encoding();
                break;
            case EncodingType.UTF8:
                encoding = new System.Text.UTF8Encoding();
                break;
        }
        return encoding.GetBytes(str);
    }
public enum EncodingType
    {
        ASCII,
        Unicode,
        UTF7,
        UTF8
    }

من الواضح لي أن استدعاء الدالة أعلاه مع EncodingType.ASCII من الخطأ ولكن أنا في حيرة حول ما يمكن أن يكون صحيحا؟ ما هو "مباراة" المناسبة بين "باستخدام Base64" المرسلة من كولد فيوجن والطريقة التي ينبغي أن ترميز سلسلة في صافي؟

تجدر الإشارة إلى أن كافة التعليمات البرمجية "يعمل" ولكن استرجاعها فيما بعد ملف يظهر أن يتم سارعت وأنا متأكد لدي الترميز الخطأ هنا.

وتحرير التحديث:

وأضاف I رمز التعداد حذف سابقا. لقد حاولت كل هذه أنواع ترميز. أنهم جميعا تؤدي إلى "القمامة". وهذا هو: لقد حاولت كل من هذه الاختلافات:

byte[] binData = StringToByteArray(fileContent, EncodingType.ASCII);
byte[] binData = StringToByteArray(fileContent, EncodingType.Unicode);
byte[] binData = StringToByteArray(fileContent, EncodingType.UTF7);
byte[] binData = StringToByteArray(fileContent, EncodingType.UTF8);

وأي من هذه العمل بشكل صحيح. كما قرأت وظيفة المقترحة الخاص بك، يجب أن يكون يونيكود. لاحظ أن أريد أن أعود صفيف بايت يست سلسلة المحولة. ما زال غامضا جدا.

والإجابة:

وأنا ببساطة القضاء على التعداد وظيفة كتبت دعا StringToByteArray. بدلا من ذلك ترميز التالية:

byte[] binData = Convert.FromBase64String(fileContent); 
هل كانت مفيدة؟

المحلول

ونظرة على وظيفة Convert.FromBase64String()

نصائح أخرى

وباستخدام Base64 هو نظام ترميز والتي تمكنك من تمثيل البيانات الثنائية على شكل سلسلة من الأحرف ASCII بحيث يمكن إدراجها في الملفات النصية ورسائل البريد الإلكتروني التي البيانات الثنائية الخام غير مقبول. توضح الأمثلة التالية فك التشفير والترميز سلاسل يونيكود. اسمحوا لي أن أعرف إذا كان هذا هو ما تريد، إن لم يكن يمكنني refind هذا أبعد بالنسبة لك.

//Encoding
 public static string StringToBase64 (string src) {

    // Get's byte representation unicode string
    byte[] b = Encoding.Unicode.GetBytes(src);

    // Returns Base64-encoded string
    return Convert.ToBase64String(b);

}
//Decoding
public static string Base64ToString (string src) {

    // Decodes Base64-encoded string to a byte array
    byte[] b = Convert.FromBase64String(src);

    // Returns decoded Unicode string
    return Encoding.Unicode.GetString(b);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top