如何在不使用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();
}
}
}
答案 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[]
开始传递给方法吗?看看如何填充该列表会很有趣。