不使用ToArray()将字节列表转换为memorystream

时间:2016-08-10 09:31:27

标签: c#

如何在不使用list<byte>或创建新阵列的情况下将MemoryStream()保存到ToArray()

这是我目前的方法:

public Packet(List<byte> data)
{
    // Create new stream from data buffer
    using (Stream stream = new MemoryStream(data.ToArray()))
    {
        using (BinaryReader reader = new BinaryReader(stream))
        {
            Length = reader.ReadInt16();
            pID = reader.ReadByte();
            Result = reader.ReadByte();
            Message = reader.ReadString();
            ID = reader.ReadInt32();
        }
    }
}

3 个答案:

答案 0 :(得分:1)

使用文档化的API,MemoryStream解决方案是最有效的解决方案。 List<T>.ToArray()不会复制数组。它只会存储它。因此,唯一的副本位于List<T>

如果您想避免该副本,则需要使用反射打开MemoryStream并访问后备阵列。我建议反对。

相反,请使用允许您使用合法方法获取支持数组的集合。写下你自己的,或者首先使用List<T>

无论如何,memcpy不是最有效的移动字节的方法。存储它们很好,移动它们通常会有更多的开销。例如,按字节顺序添加项目将比from tkinter import * import tkinter.ttk def combo_events(evt): if int(evt.type) is 4: w = evt.widget w.event_generate('<Down>') root = Tk() li = ('row 1', 'row 2', 'row 3') combo1 = tkinter.ttk.Combobox(root, value=li) combo2 = tkinter.ttk.Combobox(root, value=li) combo1.bind('<Button-1>', combo_events) combo2.bind('<Button-1>', combo_events) combo1.pack() combo2.pack() root.mainloop() 慢得多。

答案 1 :(得分:0)

为什么不在列表上循环

  ...
  using (MemoryStream stream = new MemoryStream(data.Count)) {
    foreach (var b in data)
      stream.WriteByte(b);

    // You may want to return to stream's origin
    stream.Position = 0; 
    ...

答案 2 :(得分:0)

如下:

public Packet(List<byte> data)
{
    using (Stream stream = new MemoryStream())
    {
        // Loop list and write out bytes
        foreach(byte b in data)
            stream.WriteByte(b);

        // Reset stream position ready for read
        stream.Seek(0, SeekOrigin.Begin);

        using (BinaryReader reader = new BinaryReader(stream))
        {
            Length = reader.ReadInt16();
            pID = reader.ReadByte();
            Result = reader.ReadByte();
            Message = reader.ReadString();
            ID = reader.ReadInt32();
        }
    }
}

但为什么你首先要有一个清单?你不能把它作为byte[]开始传递给方法吗?看看如何填充该列表会很有趣。