파일의 시작 부분부터 32 비트 부호없는 오프셋을 가진 파일 형식 (TIFF)을 읽었습니다.32 비트 부호없는 오프셋으로 검색
불행하게도 fseek과의 프로토 타입은, 내가 오프셋 특정 파일에 갈 것이 일반적인 방법이며, 그래서 오프셋
int fseek (FILE * stream, long int offset, int origin);
이 서명됩니다. 이 상황을 어떻게 처리해야합니까? 검색을 위해 다른 기능을 사용해야합니까?
파일의 시작 부분부터 32 비트 부호없는 오프셋을 가진 파일 형식 (TIFF)을 읽었습니다.32 비트 부호없는 오프셋으로 검색
불행하게도 fseek과의 프로토 타입은, 내가 오프셋 특정 파일에 갈 것이 일반적인 방법이며, 그래서 오프셋
int fseek (FILE * stream, long int offset, int origin);
이 서명됩니다. 이 상황을 어떻게 처리해야합니까? 검색을 위해 다른 기능을 사용해야합니까?
당신은 The GNU C lib - Setting the File Position of a Descriptor
이 기능은 lseek의 기능과 유사에서
int fd = fileno (stream);
노트와
lseek64()
(man page)#define _LARGEFILE64_SOURCE /* See feature_test_macros(7) */ #include <sys/types.h> #include <unistd.h> off64_t lseek64(int fd, off64_t offset, int whence);
를 사용하려고 할 수 있습니다. 차이점은 offset 매개 변수가 off_t 대신 off64_t 유형이므로 32 비트 시스템에서 2^31 바이트보다 크고 2^63 바이트보다 큰 파일을 주소 지정하는 것이 가능하다는 것입니다. 파일 설명자 filedes는 open64를 사용하여 열어야합니다. 그렇지 않으면 off64_t에서 가능한 큰 오프셋은 작은 파일 모드에서 설명자와 함께 오류를 발생시킵니다.
32 비트 컴퓨터에서 소스 파일을 _FILE_OFFSET_BITS == 64로 컴파일하면이 함수는 실제로 lseek라는 이름으로 사용 가능하므로 32 비트 인터페이스를 투명하게 대체합니다. Streams and File Descriptors 스트림 파일 기술자의 관점에서 구현되기 때문에
에서 약
fd
및stream
는, 당신은 스트림에서 파일 기술자를 추출하고 파일 기술자에 직접적으로 낮은 수준의 작업을 수행 할 수 있습니다. 또한 처음에는 연결을 파일 설명자로 연 다음 해당 파일 설명 자와 연결된 스트림을 만들 수도 있습니다.
이 질문을 더 깊이 연구하고 다른 의견과 답변 (고맙습니다)을 고려한 후 가장 간단한 방법은 오프셋이 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 비트 아키텍처에서 실행 될 수 있다는 점이다. 구조 fpos_t
을 사용하여 임의로 큰 오프셋을 관리하는 기능이있는 fsetpos
이 있지만 복잡한 점이 많습니다. fsetpos
이 실제로는 큰 크기의 오프셋을 사용했다면 이해할 수 있지만, 가능한 가장 큰 오프셋이 uint32_t라는 것을 알고 있기 때문에 이중 탐색이 필요를 충족시킵니다.
이 솔루션을 사용하면 모든 TIFF 파일을 32 비트 시스템에서 처리 할 수 있습니다. PixInsight와 같은 상용 프로그램을 고려한다면이 점의 장점이 분명합니다. PixInsight는 32 비트 시스템에서 실행될 때 2147483648 바이트보다 작은 TIFF 파일 만 처리 할 수 있습니다. 전체 크기의 TIFF 파일을 처리하려면 사용자는 64 비트 컴퓨터에서 64 비트 버전의 PixInsight를 사용해야합니다. 이는 PixInsight 프로그래머가 내부적으로 오프셋을 처리하기 위해 64 비트 유형을 사용했기 때문일 수 있습니다.내 솔루션은 32 비트 형식 만 사용하므로 32 비트 시스템에서 전체 크기의 TIFF 파일을 처리 할 수 있습니다 (기본 운영 체제가 큰 파일을 처리 할 수있는 경우).
어떤 OS를 사용하십니까? 32 비트 아키텍처를 사용하고 있습니까? – melpomene
@melpomene이 코드는 32 비트 및 64 비트 아키텍처에서 작동해야하며 다른 컴퓨터와 운영 체제에서 실행될 수 있습니다. –
2 또는 4GB를 초과하는 TIFF 파일은 일반적이지 않습니다. 당신의 CRT는 오랫동안 긴 논쟁을하는 대안을 가지고 있습니다, 당신은 그것의 문서를 봐야 할 것입니다. –