c# - 在 C# 中以编程方式生成的 gz 文件与手动生成的文件不同
问题描述
我正在分析属于应用程序的文件库,该应用程序 gz-compress 并向上传到它的每个文件添加自定义标头。
标头是由标头起始元素组成的 ASCII 文本,包含压缩文件的 sha-1 校验和以及在标头结尾元素之前解压缩文件的长度。
我可以通过删除标题(通常约为 65 字节)手动解压文件,保存文件,然后使用 7-zip、gunzip 和类似工具解压缩。如果我检查生成的 gz 文件的哈希值和解压缩文件的长度,则所有内容都与存储在标头中的预期哈希值和长度相匹配。
如果我以编程方式执行相同的操作,我会得到奇怪的结果。我希望 gz 文件和解压缩文件与手动解压缩文件具有相同的哈希和长度,但事实并非如此。下面代码生成的 gz 文件比手动处理的文件大约 700 字节,不用说哈希不匹配。解压后的文件(图像)在视觉上与手动解压后的文件相同,长度完全相同,但哈希值不同。
左边的文件是我手动处理的gz文件。正确的是以编程方式完成的,并声称(非常相同的)图像是 2.4GB。我在某处做错了什么,或者这是“设计的”?
static void Main(string[] args)
{
string TempDir = @"c:\temp\so\";
string file = "../../../SampleFiles/SPO_6c5af66f-0a8b-4b27-848b-7e19346ee6c7.jpg";
FileInfo myFile = new FileInfo(file);
List<byte> fileContents = new List<byte>();
using (FileStream fs = myFile.OpenRead())
{
int bytesToRead = 1024;
int fileLength = Convert.ToInt32(fs.Length);
Byte[] tmpData = new Byte[bytesToRead];
if (fileLength < bytesToRead) {
bytesToRead = Convert.ToInt32(fileLength);
}
int numRead = fs.Read(tmpData, 0, bytesToRead);
while (numRead > 0 || fileLength > 0)
{
fileContents.AddRange(tmpData);
numRead = fs.Read(tmpData, 0, bytesToRead);
fileLength -= bytesToRead;
if (fileLength < bytesToRead)
{
bytesToRead = fileLength;
}
}
var gzdata = fileContents.Skip(66).ToArray<byte>();
var compressedStream = new MemoryStream(gzdata);
var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress);
var resultStream = new MemoryStream();
zipStream.CopyTo(resultStream);
var resArray = resultStream.ToArray();
compressedStream.Flush();
File.WriteAllBytes(TempDir + "testfile.jpg.gz", gzdata);
File.WriteAllBytes(TempDir + "testfile.jpg", resultStream.ToArray());
}
}
解决方案
推荐阅读
- node.js - 自 npm v5.5.1 以来,本地 npm 依赖被破坏
- php - 当元素之一未设置时,表达式返回 true。对象数组
- python - Keras:正确指定输出的形状(用于卷积自动编码器)
- android - 在 pjsip 中成功编译 android 后尝试构建 libpjsua2.so 文件时目标不兼容
- node.js - Docker在我的电脑中部署redis和node(Windows)
- vba - 如何根据下拉框动态改变一个形状数据
- javascript - NodeJS - 如何强制函数仅在集群中的特定工作人员 ID 上运行?
- python - 无法在 Python virtualenv 中导入已安装的模块
- python-3.x - Python过滤列表,删除\'n'和空字符串
- java - 如何仅从属性文件中加载特定的关键字或行而不在 java 中加载完整的属性文件