C++ 带有QDataStream的TGA读取头

C++ 带有QDataStream的TGA读取头,c++,qt,qdatastream,tga,C++,Qt,Qdatastream,Tga,我正在尝试使用QtQDataStream读取TGA文件头。我有以下固定类型规范中的结构: #pragma pack(push, 1) /* TGA header */ struct tga_header_t { quint8 id_lenght; /* size of image id */ quint8 colormap_type; /* 1 is has a colormap */ quint8 image_type;

我正在尝试使用QtQDataStream读取TGA文件头。我有以下固定类型规范中的结构:

#pragma pack(push, 1)
/* TGA header */
struct tga_header_t
{
    quint8   id_lenght;            /* size of image id */
    quint8   colormap_type;        /* 1 is has a colormap */
    quint8   image_type;           /* compression type */

    /* Color Map Specification */
    quint16  cm_origin;            /* colormap origin */
    quint16  cm_length;            /* colormap length */
    quint8   cm_size;              /* colormap size */

    /* Image Specification */
    quint16  x_origin;           /* bottom left x coord origin */
    quint16  y_origin;           /* bottom left y coord origin */
    quint16  width;              /* picture width (in pixels) */
    quint16  height;             /* picture height (in pixels) */
    quint8   pixel_depth;        /* bits per pixel: 8, 16, 24 or 32 */
    quint8   image_descriptor;   /* 24 bits = 0x00; 32 bits = 0x80 */
};
#pragma pack(pop)
我用QFile打开一个文件,然后用它构造一个QDataStream,如下所示:

QFile file(path);
tga_header_t header;

file.open(QIODevice::ReadOnly);
QDataStream stream(&file);
stream >> header.id_lenght >>
          header.colormap_type >>
          header.image_type >>
          header.cm_origin >>
          header.cm_length >>
          header.cm_size >>
          header.x_origin >>
          header.y_origin >>
          header.width >>
          header.height >>
          header.pixel_depth >>
          header.image_descriptor;
qDebug() << header.id_lenght << "id_lenght" <<
            header.colormap_type << "colormap_type" <<
            header.image_type << "image_type" <<
            header.cm_origin << "cm_origin" <<
            header.cm_length << "cm_length" <<
            header.cm_size << "cm_size" <<
            header.x_origin << "x_origin" <<
            header.y_origin << "y_origin" <<
            header.width << "width" <<
            header.height << "height" <<
            header.pixel_depth << "pixel_depth" <<
            header.image_descriptor << "image_descriptor" <<
            "SIZE:" << sizeof(header);
我应该得到1366和768。如果我已转储文件,我将获得:

0000000 0000 0002 0000 0000 0000 0000 0556 0300
0000010 0018 0000 0000 0000 0000 0000 0000 0000
这很奇怪,因为它的开头有一个额外的字节,在
0x0002
0x0556
之间的某个地方缺少另一个字节

更新:

使用fstream是可行的,所以如果我错了,请纠正我,但我认为数据是正确的。您的电脑将16位单词解释为小尾端。在文件中,它们存储为big-endian


对于所有16位类型,应交换低/高字节。您还可以使用Qt中的helper函数:

stream>>header.id\u lengh这是打字错误吗?我认为应该是
stream>>header.id\u lenght>>…
。是的,这是一个打字错误(已更正)
0000000 0000 0002 0000 0000 0000 0000 0556 0300
0000010 0018 0000 0000 0000 0000 0000 0000 0000
    stream.read((char*)&header.id_lenght, sizeof(header.id_lenght));
    stream.read((char*)&header.colormap_type, sizeof(header.colormap_type));
    stream.read((char*)&header.image_type, sizeof(header.image_type));
    stream.read((char*)&header.cm_origin, sizeof(header.cm_origin));
    stream.read((char*)&header.cm_length, sizeof(header.cm_length));
    stream.read((char*)&header.cm_size, sizeof(header.cm_size));
    stream.read((char*)&header.x_origin, sizeof(header.x_origin));
    stream.read((char*)&header.y_origin, sizeof(header.y_origin));
    stream.read((char*)&header.width, sizeof(header.width));
    stream.read((char*)&header.height, sizeof(header.height));
    stream.read((char*)&header.pixel_depth, sizeof(header.pixel_depth));
    stream.read((char*)&header.image_descriptor, sizeof(header.image_descriptor));
stream.readRawData((char*)&header.id_lenght, sizeof(header.id_lenght));
    stream.readRawData((char*)&header.colormap_type, sizeof(header.colormap_type));
    stream.readRawData((char*)&header.image_type, sizeof(header.image_type));
    stream.readRawData((char*)&header.cm_origin, sizeof(header.cm_origin));
    stream.readRawData((char*)&header.cm_length, sizeof(header.cm_length));
    stream.readRawData((char*)&header.cm_size, sizeof(header.cm_size));
    stream.readRawData((char*)&header.x_origin, sizeof(header.x_origin));
    stream.readRawData((char*)&header.y_origin, sizeof(header.y_origin));
    stream.readRawData((char*)&header.width, sizeof(header.width));
    stream.readRawData((char*)&header.height, sizeof(header.height));
    stream.readRawData((char*)&header.pixel_depth, sizeof(header.pixel_depth));
    stream.readRawData((char*)&header.image_descriptor, sizeof(header.image_descriptor));