Распаковка данных TIFF печатает случайный символ

Итак, у меня есть этот TIFF со сжатием 32946, то есть COMPRESSION_DEFLATE.

Я читаю от руки:

ifstream istream;
std::string line;
TIFHEAD header;
istream.open("pic.tif",ios::binary|ios::in);
istream.read((char*)&header, sizeof(TIFHEAD));
istream.seekg(header.IFDOffset);

WORD numEntries1;
istream.read((char *)&numEntries1, sizeof(WORD));
cout<<numEntries1<<endl;

DWORD tagOffset;
DWORD stripByte;

for(int i=0; i<numEntries1; i++) {
    TIFTAG tag;
    istream.read((char *)&tag, sizeof(TIFTAG));
}

и нашел все шестнадцатеричные значения TIFF.

Теперь у меня есть значение data3.txt, содержащее все шестнадцатеричные значения из шестнадцатеричного дампа. Здесь вставляется в документы:

Пока это мой код zlib, и для большинства данных он печатает правильно (по какой-то причине в середине он начинает многократно печатать 000 и новую строку, а затем переходит к символам, отличным от ASCII).

int main(int argc, char **argv) {
    gzFile inFileZ = gzopen("data3.txt", "rb");
    unsigned char unzipBuffer[4];
    uint8_t unzippedBytes;
    while (true) {
        unzippedBytes = gzread(inFileZ, unzipBuffer, 4);
        std::cout<<std::hex<<unzipBuffer<<std::endl;
        z_stream stream;
        stream.next_in = unzipBuffer;
        inflate(&stream, 1);
        std::cout<<stream.next_in<<std::endl;
    }
    gzclose(inFileZ);
}

и второе, что распечатывается, - это частично значения и частично не-ASCII-символы. Почему это?

если это неясно, моя конечная цель - прочитать TIFF вручную, который имеет плавающие точки в каждом пикселе. Я хочу просто получить все эти поплавки.

РЕДАКТИРОВАТЬ: Кроме того, даже если data3.txt содержит только 12 символов, существует бесконечный цикл. Почему?


person Community    schedule 03.07.2017    source источник


Ответы (1)


Насколько я могу судить, вы распаковываете двоичные значения с плавающей запятой и обрабатываете их как ASCII, что создает что-то похожее на мусор.

person Malcolm McLean    schedule 03.07.2017
comment
Это имеет смысл, но как я могу посмотреть на поплавки, чтобы убедиться, что я их правильно понимаю? - person ; 03.07.2017
comment
float *f = (float *) unzipBuffer; затем напечатайте f(%f, f[i]), чтобы убедиться, что это правильные данные. Более надежное решение см. в моих функциях IEEE754 github.com/MalcolmMcLean/ieee754. - person Malcolm McLean; 03.07.2017