2

我有两种列表:一个带有 int 元素的列表和另一个带有 bool 元素的列表。要将这些列表传递给服务器,我必须执行以下操作:

using(MemoryStream m = new MemoryStream()){
  using(BinaryWriter writer = new BinaryWriter(m)){
    byte[] bytesIntList = new byte[IntList.Count * sizeof(int)];
    Buffer.BlockCopy(IntList.ToArray(), 0, bytesIntList, 0, bytesIntList.Length);
    writer.Write(Convert.ToBase64String(bytesIntList));

    byte[] bytesBoolList = new byte[BoolList.Count * sizeof(bool)];
    Buffer.BlockCopy(BoolList.ToArray(), 0, bytesBoolList, 0, bytesBoolList.Length);
    writer.Write(Convert.ToBase64String(bytesBoolList));
  }
  byte[] data = m.ToArray();
  return data;
}

现在,我想知道如何执行相反的过程:接收这些列表:

using (MemoryStream m = new MemoryStream(data)){
  using (BinaryReader reader = new BinaryReader(m)){
    byte[] bytesIntList = Convert.FromBase64String(reader.ReadString());
    byte[] bytesBoolList = Convert.FromBase64String(reader.ReadString());
    List<int> newIntList = ??? //what do I have to do here?
    List<bool> newBoolList = ??? //what do I have to do here?
  }
}

如果您有其他通过列表的建议,我们将不胜感激!

4

1 回答 1

1

您的问题是,尽管有一种方法可以轻松地从字节数组转到整数数组,但没有办法从字节数组转到整数列表。

您必须先将其转换为数组(就像您在保存它时所做的那样),或者您必须一次通过字节缓冲区一个 int。

首先转换为数组如下所示:

byte[] data = new byte[1000]; // Pretend this is your read-in data.

int[] result = new int[data.Length/sizeof(int)];
Buffer.BlockCopy(data, 0, result, 0, data.Length);
List<int> list = result.ToList();

我认为一次将其转换为 int 会更好,因为您不需要先将其转换为数组:

byte[] data = new byte[1000]; // Pretend this is your read-in data.
List<int> list = new List<int>();

for (int i = 0, j = 0; j < data.Length; ++i, j += sizeof(int))
    list.Add(BitConverter.ToInt32(data, j));

要将字节数组转换为布尔数组,您可以这样做:

byte[] data = new byte[1000]; // Pretend this is your read-in data.
List<bool> list = new List<bool>();

for (int i = 0, j = 0; j < data.Length; ++i, j += sizeof(bool))
    list.Add(BitConverter.ToBoolean(data, j));

或者,为了将字节转换为布尔值,我们可以使用 Linq(将字节转换为整数并不那么容易):

byte[] data = new byte[1000]; // Pretend this is your read-in data.
List<bool> list = (from b in data select b != 0).ToList();

或者使用方法而不是查询语法(如果您愿意的话):

byte[] data = new byte[1000]; // Pretend this is your read-in data.
List<bool> list = data.Select(b => b != 0).ToList();
于 2013-05-24T14:35:24.090 回答