在 C# 中将 Session 中的 Byte[] 转换回 List<String>
Converting a Byte[] from a Session back to a List<String> in c#
我尝试通过将列表转换为字节[] 来在会话中保存列表。但是当我尝试将它转换回列表时,我只得到一些随机数。这是我可以保存其中包含语言的列表的唯一方法。
在我转换并保存在会话中的代码下方
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);
}
列表在我将其转换回显示在页面上后应该看起来像以前一样。这是正确的方法还是我完全错了?
在 byte[]
集合上调用 .ToArray()
将 return 一个 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()
目前您正在将编码值排序为一个长字节数组,当您解码它们时您不知道它们从哪里开始或结束 - 所以如果您添加一个分隔符,您可以这样做:这里我'我使用 [=12=]
:
byte[] LanguagesInBytes = languages
.SelectMany(s => System.Text.Encoding.ASCII.GetBytes(s + "[=10=]"))
.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 意味着像 ö
这样的扩展字符会在此过程中丢失。
我尝试通过将列表转换为字节[] 来在会话中保存列表。但是当我尝试将它转换回列表时,我只得到一些随机数。这是我可以保存其中包含语言的列表的唯一方法。
在我转换并保存在会话中的代码下方
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);
}
列表在我将其转换回显示在页面上后应该看起来像以前一样。这是正确的方法还是我完全错了?
在 byte[]
集合上调用 .ToArray()
将 return 一个 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()
目前您正在将编码值排序为一个长字节数组,当您解码它们时您不知道它们从哪里开始或结束 - 所以如果您添加一个分隔符,您可以这样做:这里我'我使用 [=12=]
:
byte[] LanguagesInBytes = languages
.SelectMany(s => System.Text.Encoding.ASCII.GetBytes(s + "[=10=]"))
.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 意味着像 ö
这样的扩展字符会在此过程中丢失。