Преобразовать из байтового массива в список - PullRequest
0 голосов
/ 30 января 2012

Я конвертирую List<string> в байтовый массив следующим образом:

Byte[] bArray = userList
                .SelectMany(s => System.Text.Encoding.ASCII.GetByte(s))
                .ToArray();

Как я могу преобразовать его обратно в List<string>?Я попытался использовать ASCII.GetString(s) в приведенном выше коде, но GetString ожидал byte[], а не один байт.

Ответы [ 4 ]

5 голосов
/ 30 января 2012

Невозможно изменить ваш алгоритм.

Проблему можно увидеть, если учесть, что происходит, когда у вас есть два пользователя с именами «ab» и «c». Это даст те же байты, как если бы у вас было два пользователя с именами «a» и «bc». Невозможно провести различие между этими двумя случаями с помощью вашего подхода.

Вместо того, чтобы придумывать свой собственный формат сериализации, вы можете просто использовать сериализацию , встроенную в .NET Framework, такую ​​как BinaryFormatter.

3 голосов
/ 30 января 2012

В качестве небольшого отступления, если вы сохраните нулевое байтовое завершение строки, вы можете легко объединить строки и извлечь всю информацию, например,

Byte[] bArray = userList
    .SelectMany(s => System.Text.Encoding.ASCII.GetBytes(s + '\0')) // Add 0 byte
    .ToArray();

List<string> names = new List<string>();
for (int i = 0; i < bArray.Length; i++)
{
    int end = i;
    while (bArray[end] != 0) // Scan for zero byte
        end++;
    var length = end - i;
    var word = new byte[length];
    Array.Copy(bArray, i, word, 0, length);
    names.Add(ASCIIEncoding.ASCII.GetString(word));
    i += length;
}
1 голос
/ 30 января 2012

Вы не можете сделать это, поскольку разделители структуры массива были потеряны в методе SelectMany.

1 голос
/ 30 января 2012

Вам необходимо вставить разделитель между строками, чтобы вы могли разделить массив больших байтов обратно на исходных пользователей. Разделитель должен быть символом, который не может быть частью имени пользователя.

Пример (при условии, что | не может быть частью имени пользователя):

var bytes = System.Text.Encoding.ASCII.GetByte(string.Join("|", userList.ToArray()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...