我正在C#中实现压缩算法。问题是我在压缩之前不知道文件大小。解决这个问题的最好方法是什么?当然,我将压缩数据存储到数组中,但在压缩之前我不知道它的大小。未知阵列大小C# - 压缩
回答
要获得未压缩文件的大小,应该使用System.IO.FileInfo
类,该文件的长度属性为文件大小(以字节为单位)。
在大多数情况下,我会使用这个加上10%大小的数组[s],压缩文件会更小,但有些情况下'压缩'文件实际上比原始文件大(例如,你是否尝试压缩已压缩的文件)。在使用之前,确保输出数组初始化为NULL。
输出文件的大小将是输出数组的大小减去最后的NULL列表。
金龟
的压缩数据的大小只能从输入数据的大小,较新的真已知猜测。您应该为输出数据使用动态数组(或等效)。请注意输出尺寸可能比输入数据大大。
是的人,但我不知道它是2倍大的尺寸,3倍的大小,等等。另外,我避免使用阵列的大小调整,因为我不知道它有多快。 – user216799
最有可能的是,您将(取决于算法)输入大小的至多2倍的上限。但是如果你从一个缓冲区开始,说输入大小的一半,你最多可以改变两次大小。这应该不会损害性能 – PMF
可以使用Generic lists
,而不是数组,如果你不知道数组大小:
List<byte> list = new List<byte>();
那么你不需要设置列表大小,它会自动只要你添加新项目发展。
+1实际上它是正确的,即使我不会使用列表,我甚至不会将所有数据保存在内存中(除非是需求)。 –
您可以使用这样的事情:
byte[] CompressByteArray(byte[] uncompressedData)
{
byte[] compressedData;
using (MemoryStream ms = new MemoryStream())
{
using (BinaryWriter writer = new BinaryWriter(ms))
{
// dummy compression algorithm
for (int i = 0; i < uncompressedData.Length; i += 2)
{
var newByte = uncompressedData[0] + uncompressedData[1];
writer.Write(newByte);
}
}
ms.Flush();
ms.Position = 0;
compressedData = ms.ToArray();
}
return compressedData;
}
但是它是非常低效的。您还应该将输入文件作为流,而不是将字节数组作为字节数组,如果不希望内存被填充。基本上你需要从流中读取数据并写入另一个数据流(也许MemoryStream实际上应该是一个文件流,以便在压缩大文件时直接写入磁盘上的临时文件)。
- 1. 未知大小的阵列
- 2. 压缩阵列
- 3. 如何查找离子压缩文件的未压缩大小
- 4. Python bz2未压缩文件大小
- 5. 获取未压缩的图像大小
- 6. 传递未知大小的2D阵列的函数C++
- 7. 压缩/缩小VIDEO的文件大小
- 8. 什么是HBase压缩队列大小?
- 9. 如何将更大的阵列缩小为更小的阵列?
- 10. RCaller获取未知大小的矩阵
- 11. 放大BMP未压缩
- 12. 像素阵列压缩
- 13. 与pytables压缩阵列
- 14. 有效压缩numpy阵列
- 15. 稀疏阵列压缩
- 16. 调整大小C#阵列
- 17. 是否可以限制unix中未压缩的压缩文件的大小?
- 18. Apache 2.4.10 mod_deflate小型响应大小未压缩
- 19. 如何获得双正交小波矩阵压缩感知
- 20. 如何初始解压缩阵列与另一解压阵列
- 21. C - 从文件中读取未知大小的矩阵
- 22. Java通过反射确定未知阵列中的阵列大小
- 23. 减小.exe大小。 EXE压缩机
- 24. zlib压缩的最小数据大小?
- 25. C#字符串格式未知大小
- 26. 获取的未压缩gzip文件的大小,同时压缩文件的大小可从服务器
- 27. 大领域压缩文件大小
- 28. 阵LZW压缩
- 29. 声明和初始化具有未知大小2D阵列
- 30. 副本未知大小的数组到另一个阵列
你能否给我们提供更多的细节和注意细节,如何时需要压缩和解压缩?如果你想压缩一个文件,但你不知道它的大小没有压缩,这有点令人困惑。在压缩之前,您可以知道要压缩的数据的大小,但无法知道压缩数据的大小。 – Cosmin
我的意思是压缩文件的大小......我在压缩过程完成之前无法知道它。 – user216799
请添加您尝试的代码,以便我可以根据需要调整我的解决方案。 – Cosmin