用二进制文件填充结构
Fill struct with a binary file
我想填写以下结构:
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
我想在读取我的二进制文件时保存填充结构,所以我已经实现了这一点,这还没有完成,因为我不知道如何从 2 个字节中获取short int
。
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 个字节(。
相关文章:
- 使用结构成员指针在C++中填充结构
- C++:使用缓冲区中的数据填充结构
- 在AAPCS(ARM ABI)下,C/C++结构填充的稳定性如何
- 我想直接在结构中插入,但没有一种方法可以正确避免填充问题
- 用二进制文件填充结构
- 哪些值存储在对齐的结构/类对象的填充字节中
- 使用初始化列表填充C++中的多维结构数组时出现问题
- sizeof 函数如何在带和不带位字段的结构上工作?(填充)
- 与STD :: BITSET的工会成员的结构填充
- 是否有任何环境会导致"int"结构填充?
- 如何在编译时计算c++11中的结构填充
- C++:OpenGL,glm和结构填充
- 关于结构填充
- 赛灵思微火焰结构填充/填料
- C++结构填充和字段打包
- C++ 用结构填充 2D 矢量
- VS 2008/2010中是否控制尾部结构填充?(#pragma包不够好)
- 64位计算机上的结构填充
- Visual Studio 2008 - 关于 C++ 中的结构填充
- 数据结构填充