gpt4 book ai didi

c - fseek 到 32 位无符号偏移量

转载 作者:太空宇宙 更新时间:2023-11-04 04:19:56 24 4
gpt4 key购买 nike

我正在读取一种文件格式 (TIFF),它从文件开头开始有 32 位无符号偏移量。

不幸的是,fseek 的原型(prototype)是:

int fseek ( FILE * stream, long int offset, int origin );

所以偏移量是有符号的。我应该如何处理这种情况?我应该使用不同的功能来寻找吗?

最佳答案

在更深入地研究了这个问题并考虑了其他评论和答案(谢谢)之后,我认为最简单的方法是如果偏移量大于 2147483647 字节则进行两次查找。这允许我将偏移量保持为 uint32_t 并继续使用 fseek。因此定位代码是这样的:

// note: error handling code omitted
uint32_t offset = ... (whatever it is)
if( offset > 2147483647 ){
fseek( file, 2147483647, SEEK_SET );
fseek( file, (long int)( offset - 2147483647 ), SEEK_CUR );
} else {
fseek( file, (long int) offset, SEEK_SET );
}

使用 64 位类型的问题是代码可能在 32 位架构上运行(除其他外)。有一个函数 fsetpos 使用结构 fpos_t 来管理任意大的偏移量,但这带来了一系列的复杂性。尽管 fsetpos 如果我真的使用任意大的偏移量可能有意义,但因为我知道最大可能的偏移量是 uint32_t,所以双重寻道可以满足该需求。

请注意,此解决方案允许在 32 位系统上处理所有 TIFF 文件。如果您考虑像 PixInsight 这样的商业程序,这样做的好处是显而易见的。在 32 位系统上运行时,PixInsight 只能处理小于 2147483648 字节的 TIFF 文件。要处理全尺寸 TIFF 文件,用户必须在 64 位计算机上使用 64 位版本的 PixInsight。这可能是因为 PixInsight 程序员使用 64 位类型在内部处理偏移量。由于我的解决方案仅使用 32 位类型,因此我可以在 32 位系统上处理全尺寸 TIFF 文件(只要底层操作系统可以处理那么大的文件)。

关于c - fseek 到 32 位无符号偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47739641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com