簡體   English   中英

將 Byte[] 從 Session 轉換回列表<string>在 c#</string>

[英]Converting a Byte[] from a Session back to a List<String> in c#

我嘗試通過將列表轉換為字節 [] 來將列表保存在 Session 中。 但是當我嘗試將其轉換回列表時,我只會得到一些隨機數。 這是我可以使用其中的語言保存列表的唯一方法。

在我轉換並將其保存在 session 的代碼下方

   private void AllowedLanguages(Userdata User)
        {
            List<string> languages = new List<string>();            

            if (User.Deutsch == true) { languages.Add("Deutsch"); }
            if (User.Englisch == true) { languages.Add("Englisch"); }
            if (User.Französisch == true) { languages.Add("Französisch"); }
            if (User.Italienisch == true) { languages.Add("Italienisch"); }
            if (User.Japanisch == true) { languages.Add("Japanisch"); }
            if (User.Mandarin == true) { languages.Add("Mandarin"); }
            if (User.Polnisch == true) { languages.Add("Polnisch"); }
            if (User.Portugiesisch == true) { languages.Add("Portugiesisch"); }
            if (User.Spanisch == true) { languages.Add("Spanisch"); }

            byte[] LanguagesInBytes = languages
             .SelectMany(s => System.Text.Encoding.ASCII.GetBytes(s))
             .ToArray();

            HttpContext.Session.Set("AllowedLanguages", LanguagesInBytes);
        }

這是我嘗試將其恢復為 Arraylist 或任何其他類型的字符串列表的代碼

            var LanguagesByte = HttpContext.Session.Get("AllowedLanguages");

            for (int i = 0; i < LanguagesByte.Length; i++)
            {
                String str = new String(LanguagesByte[i].ToString());
                Languages.Add(str);
            }

在我將其轉換回以在頁面上顯示它之后,列表應該看起來像以前。 這甚至是正確的方法還是我完全錯了?

目前,您將編碼值排序為一個長字節數組,當您解碼它們時,您不知道它們從哪里開始或結束 - 所以如果您添加分隔符,您可以這樣做:這里我使用\0

byte[] LanguagesInBytes = languages
  .SelectMany(s => System.Text.Encoding.ASCII.GetBytes(s + "\0"))
  .ToArray();

然后,解碼它們:

List<string> output = new List<string>();
string language = string.Empty;
for (int i = 0; i < LanguagesInBytes.Length; i++) {
    var item = LanguagesInBytes[i];
    if (item == 0) {
        output.Add(language);
        language = string.Empty;
    }
    else {
        language += System.Text.Encoding.ASCII.GetString(new[] { item });
    }   
}

另請注意,將值存儲為 Ascii 意味着在此過程中會丟失像ö這樣的擴展字符。

byte[]集合上調用.ToArray()將返回一個byte[][] (本質上是一個字節數組的數組)

第二部分已接近,但您需要按如下方式進行更改。

這是將其從 object 轉換為 byte[][]

var LanguagesByte = (byte[][])HttpContext.Session.Get("AllowedLanguages");

然后我們必須從每個數組中檢索字符串,如下所示

for (int i = 0; i < LanguagesByte.Length; i++)
{
     String str = Encoding.ASCII.GetString(LanguagesByte[i]);
     Languages.Add(str);
}

您也可以使用 linq 來實現這一點

List<string> Languages = LanguageByte.Select(x => Encoding.ASCII.GetString(x)).ToList()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM