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

My code works for text files but not jpegs

我有一个正在开发的 s3fs-fuse 的分支。我的工作是使用 RC4 透明地加密文件。我已将加密添加到 FdEntity::Read 和写入函数(在 fdcache.cpp 中找到)但是当我尝试复制 jpeg 文件 (17kb) 时它失败了(文件已复制,但图像已损坏) 并且根据 cmp,文件在 4096 字节后开始有所不同。但是复制了一个198kb的文本文件没有报错

这是我所知道的:4kb 是一个块的大小。
但是,s3fs 直到 20mb 才进入 "multipart mode"。即便如此,我已经使用 -o nomultipart 禁用了多部分(我也在使用 -o direct_io)。
所以应该不是分片上传的问题

知道 4kb 之后可能会触发什么但仅限于 jpeg 文件吗?它可能与二进制文件和文本文件有关吗?

我明白了。当您使用 RC4 分段解密数据时,每个部分的大小必须与它们被编码时的大小相同。但是,读取作为参数接收的大小大于写入接收的大小(读取将被要求读取 20480 字节,而写入上限为 4096)。因此,如果我试图读取整个 20480 字节的数据部分,加密就会失败。我的解决方案是将读取的数量限制在 4096,即使我被要求读取更多。 S3fs 自动额外调用函数来补偿。该解决方案在技术上可能不是无懈可击的:不能保证数据的每个非最终部分都通过 Write 在 4096b 块中加密,并且不能保证最终部分始终以特定大小(总大小模 4096)以该对齐方式加密).但是,此解决方案足以满足我的目的。

问题只出现在 jpeg 而不是文本文件上,因为文本文件是一遍又一遍地重复的相同字符串。