用二进制文件填充结构

卡洛斯广场

我想填写以下结构:

struct Data{
    char id; // 1 byte
    char date[7]; // 7 bytes
    short int Ny; // 2 bytes
    short int Nx; 
    short int L;
    unsigned char distance;
    short int N;
    std::vector<short int> quant_levels;
    std::vector<std::vector<unsigned char>> Pixels;
};

根据有关如何解码我的二进制文件的信息:

Byte           Example                Description
0              1                      Format id (1)
1-7            31-Mar-1998 11:55      Date/Time
18-19                                 Number of rows (short int LSB first) (=NY)
20-21                                 Number of columns (=NX)
22                                    Number of 3D-levels (=L)
23-24                                 distance(m) between the 3D-levels (short int LSB first)
25                                    Number of quantisation levels (=N)
26-26+n*2-1                           quantisation levels (N * short int LSB first) in 1/10mm/h
X1-Y1                                 Pixels (NX*NY Bytes) from upper-left to down-right on the 1st 3D-Level
X2-Y2                                 Pixels (NX*NY Bytes) from upper-left to down-right on the 2nd 3D-Level
XL-YL                                 Pixels (NX*NY Bytes) from upper-left to down-right on the Lth 3D-Level

我想在读取二进制文件时保存填充结构,所以我实现了此操作,由于我不知道如何short int从2个字节中取出一个字节,因此尚未完成

Data readFile(const char* filename)
{
    Data data{};
    // open the file:
    std::fstream fh;
    fh.open(filename, std::fstream::in | std::fstream::binary);

    // read the data:
    fh.read((char*)&data.id, sizeof(char));
    fh.read((char*)&data.date, sizeof(data.date));
    fh.read((char*)&data.Ny, sizeof(data.Ny)); // WRONG, how can I move to byte 18?
    // TODO: How to continue

    return data;
}

编辑

如果有更好的方法来获取数据,请告诉我,我不限于使用结构。

生锈的

解决方案1(便携式)

将标头读取到字节向量中,然后将每个值一次转换。

例如:

// read the header
std::vector<unsigned char> vec(26);
fh.read((char*)&vec.data(), vec.size());

data.Ny = vec[18] | (vec[19] << 8);
data.Nx = vec[20] | (vec[21] << 8);
data.L = vec[22];
data.distance = vec[23] | (vec[24] << 8);
. . .

解决方案2(仅x86)

x86是低位字节序的,并且对数据对齐不敏感,因此我们可以直接读取到(打包的)结构中:

#include <cstdint>

#pragma pack(push, 1) // to prevent padding inside the struct
struct Header {
    uint8_t id;
    char date[17];
    uint16_t Ny;
    uint16_t Nx; 
    uint8_t L;
    uint16_t distance;
    uint8_t N;
};
#pragma pack(pop)

struct Data {
    Header hdr;
    std::vector<int16_t> quant_levels;
    std::vector<std::vector<unsigned char>> pixels; // [level][y][x]
};

Data readFile(const char* filename)
{
    Data data{};
    // open the file:
    std::fstream fh(filename, std::fstream::in | std::fstream::binary);

    // read the header
    fh.read((char*)&data.hdr, sizeof(data.hdr));

    data.quant_levels.resize(data.N);
    fh.read((char*)data.quant_levels.data(), data.N * 2);

    data.pixels.resize(data.L);
    for (auto& level : data.pixels) {
        level.resize(data.Nx * data.Ny);
        fh.read((char*)level.data(), data.Nx * data.Ny);
    }

    return data;
}

请注意,您的规范中有一个错字,字节1-7可能应该是1-17(请注意下一个值起始于18且也31-Mar-1998 11:55大于7个字节)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Word文件的二进制结构

来自分类Dev

解析csv文件,填充结构并写入二进制数据文件

来自分类Dev

在不知道结构的情况下用python读取二进制文件

来自分类Dev

Haskell:用二进制懒惰地读取二进制文件

来自分类Dev

如何从二进制文件读取多个结构

来自分类Dev

二进制文件写入顺序如何结构?

来自分类Dev

读取结构化二进制文件c ++

来自分类Dev

从C ++中的二进制文件中删除结构

来自分类Dev

在C ++ 11中定义二进制文件的结构

来自分类Dev

从二进制文件到屏幕的printf结构

来自分类Dev

如何从二进制文件读取多个结构

来自分类Dev

如何更新二进制文件中的结构项

来自分类Dev

无法从二进制文件中读取结构

来自分类Dev

解析混合结构的二进制文件

来自分类Dev

二进制文件如何“二进制”?

来自分类Dev

用Ruby读取不同大小的二进制文件

来自分类Dev

用C ++流式传输二进制文件

来自分类Dev

用Java包装C二进制文件

来自分类Dev

用matlab编写多精度二进制文件

来自分类Dev

用pocolibrary下载二进制文件

来自分类Dev

用gnuplot绘制单列二进制文件

来自分类Dev

用http发布流二进制文件

来自分类Dev

用R读取二进制文件

来自分类Dev

Spark用二进制列写入csv文件

来自分类Dev

用Deno读取二进制文件

来自分类Dev

用Java保存二进制STL文件

来自分类Dev

用dd修补二进制文件

来自分类Dev

用gnuplot绘制单列二进制文件

来自分类Dev

用C写入二进制文件,解释输出