我的代码适用于文本文件,但不适用于jpegs



我有一个s3fs fuse的分叉。我的工作是用RC4透明地加密文件。我已经为FdEntity::Read和Write函数添加了加密(在fdcache.cpp中找到),但当我尝试复制jpeg文件(17kb)时,它失败了(文件被复制,但图像已损坏),根据cmp,文件从4096字节开始就不同了。但是,复制198kb的文本文件时不会出现错误。

以下是我所知道的:4kb是一个块的大小
然而,s3fs直到20mb才进入"多部分模式"。即便如此,我还是用-o nomultipart禁用了multipart(我也在使用-o direct_io
所以这可能不是因为多部分上传。

你知道4kb后会触发什么,但只在jpeg文件上触发吗?它可能与二进制文件和文本文件有关吗?

我想明白了。当您使用RC4解密部分中的数据时,每个部分的大小必须与编码时相同。然而,Read作为自变量接收的大小大于Write接收的大小(Read将被要求读取20480个字节,而Write的上限为4096)。因此,如果我试图读取整个20480字节的数据段,加密就会失败。我的解决方案是将阅读量限制在4096,即使我被要求阅读更多。S3fs会自动调用函数额外的次数进行补偿。这种解决方案在技术上可能不是无懈可击的:无法保证每个非最终数据段都通过Write加密在4096b块中,也无法保证最终数据段总是以特定大小(总大小取4096的模)按该对齐方式加密。然而,这个解决方案对我来说已经足够了。

这个问题只出现在jpeg上,而没有出现在文本文件上,因为文本文件是一个反复重复的字符串。

最新更新