【问题标题】:Deleting byte[] from program and memory in C#在 C# 中从程序和内存中删除 byte[]
【发布时间】:2020-11-06 23:06:21
【问题描述】:

我正在编写一个程序,其中的一个函数为了正确创建要发送的消息,不断调用我生成的函数以将每个部分添加到数组中。问题是,在 C# 中你不能这样做,因为字节数组(如果我没记错的话,任何类型的数组)都有一个无法更改的有限长度。

因此,我想到了创建 2 字节变量。第一个将获得第一个值。第二个将在您知道必须添加的新字节数量后创建,之后,您将删除第一个变量并再次创建它,使用前一个变量的长度,但添加新值的长度,对第二个变量做同样的事情。我生成的代码是:

                byte[] message_mod_0 = adr_and_func;
                byte[] byte_memory_adr = AddAndTypes.ToByteArray(memory_adr);
                byte[] message_mod_1 = new byte[2 + byte_memory_adr.Length];
                message_mod_1 = AddAndTypes.AddByteArrayToByteArray(message_mod_0, byte_memory_adr);
                AddAndTypes.AddByteArrayToByteArray(message_mod_0, AddAndTypes.IntToByte(value));
                byte[] CRC = Aux.CRC(message_mod_0);
                AddAndTypes.AddByteArrayToByteArray(message_mod_0, CRC);

在这段代码中,我所说的两个变量是 message_mod_0 和 message_mod_1。我还考虑执行删除和重新声明所需的 byte_memory_adr 变量,以便知道要添加到输出消息中的字节数组的长度。

参数 adr_and_func、memory_adr 和 value 作为我正在制作的函数的输入参数给出。

问题可以概括为:有什么方法可以删除与创建它们相同的范围内的变量?而且,如果可以做到的话,如果我在删除第一个变量后创建了一个同名的新变量,会有什么问题吗?我想不出为什么会发生这种情况,但我对这种编程语言还是很陌生。

另外,我不知道是否有任何不那么混乱的方法。

【问题讨论】:

  • 1) 查看垃圾收集在 .NET 中的工作方式。 2)通过将变量设置为null来取消引用内存。
  • 您可以使用List<byte> 轻松形成一个数据包,然后在发送之前将其转换为ToArray()。也可以保留数组和resize it
  • 1) 您不能在 C# 中手动删除变量(如果可以的话,它就不是托管语言);2) 您可以重用变量,也就是说,如果它们是相同的类型,您可以将变量重新分配给新值
  • 我不确定您要做什么(甚至更不确定您要问什么),但看起来您正在尝试重新实现 List<byte>MemoryStream。您可能只想使用这些类型...

标签: c# arrays byte message


【解决方案1】:

这听起来像是在编写自己的自定义序列化程序。

如果可能的话,我建议只使用现有的库,例如 protobuf.net 来定义您的消息。

如果这不可能,您可以使用BinaryWriter 将您的值写入Stream。如果您想将其保存在内存中,请使用 MemoryStream 并在完成后使用 .ToArray() 来获取所有字节的数组。

至于记忆,不用担心。除非您有千兆字节大小的消息,否则内存需求应该不是问题,并且垃圾收集器将在不再需要内存时自动回收内存,并且它可以在最后一次使用后执行此操作,而不管范围如何。如果您有大量内存流,您可能需要查看 recyclable memory stream 之类的内容,因为这可以避免一些分配性能问题和碎片问题。

【讨论】:

  • 我看看能不能用 profobuf.net 弄点东西,谢谢!!!
猜你喜欢
  • 1970-01-01
  • 2011-09-06
  • 2018-04-17
  • 2012-07-01
  • 1970-01-01
  • 2010-09-22
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多