C# 如何在结构数组上运行rle算法?
我有一堆结构数组。每个结构包含3个字节和一个sbyte 为了便于理解,这里有一个小代码C# 如何在结构数组上运行rle算法?,c#,struct,run-length-encoding,C#,Struct,Run Length Encoding,我有一堆结构数组。每个结构包含3个字节和一个sbyte 为了便于理解,这里有一个小代码 public class Container { public A[] structs; } public struct A { public byte a; public byte b; public byte c; public sbyte d; public A(byte a, byte b, sbyte d) { this.a
public class Container
{
public A[] structs;
}
public struct A
{
public byte a;
public byte b;
public byte c;
public sbyte d;
public A(byte a, byte b, sbyte d)
{
this.a = a;
this.b = b;
this.c = b;
this.d = d;
}
}
现在我有很多这样的结构,因此我想使用RLE来压缩它并使用更少的内存
启动程序时,一种方法会按程序生成变量值,然后对其执行计算。此后,阵列很少使用,但仍然需要“保持它们的活力”
我尝试使用二进制连接将结构转换为uint,但这不是最好的解决方案。我一直在考虑将值转换为字符串,但我认为这将是非常不共振的
没有办法用字节代替sbytes
您认为使用RLE压缩阵列的最佳解决方案是什么?
提前谢谢
没有办法用字节代替sbytes
为什么??您可以将sbyte
强制转换为byte
并向后转换
保存数据,如uint
,并在需要时生成结构
public struct A
{
public byte a;
public byte b;
public byte c;
public sbyte d;
public A(uint value)
{
this.a = (byte)(value >> 24);
this.b = (byte)(value >> 16);
this.c = (byte)(value >> 8);
this.d = (sbyte)value;
}
public uint Value => (uint)this.a << 24 | (uint)this.b << 16 | (uint)this.c << 8 | (uint)this.d;
}
公共结构A
{
公共字节a;
公共字节b;
公共字节c;
公共SBD;
公共A(单位价值)
{
这个.a=(字节)(值>>24);
this.b=(字节)(值>>16);
this.c=(字节)(值>>8);
这个.d=(sbyte)值;
}
公共uint值=>(uint)这就是。a所以我想确认一下,你有很多这种类型的值,比如在数组或类似的集合中,而且很多值都有相同的值?没错。实际上80%的值都是相同的,这就是我想将结构转换为UINT的原因,因为它可以被更有效地压缩。但是UINT无法处理sbytes.当你说80%的值时,是否会像字节1-4相同,第5字节不同,6-9与字节1-4相同,第10字节不同?这些80/20%是如何分布的?这里的模式是什么?让我自己更正一下。在数组中,80%的结构是相同的。