C++ 在C++;风格vs C风格
很久以前,我用C编写了一个函数来编写bmp头。我使用二进制运算符将uint_16和uint_32直接解析为一个char[54]数组,该数组考虑了端性和可移植性C++ 在C++;风格vs C风格,c++,C++,很久以前,我用C编写了一个函数来编写bmp头。我使用二进制运算符将uint_16和uint_32直接解析为一个char[54]数组,该数组考虑了端性和可移植性 我学习C++有一段时间了,现在我尝试用STD::OFFROW代替文件*来重写C++函数中的函数。我产生的C++代码看起来很糟糕,不适合使用二进制代码。有没有更好或更合适的方法来编写C++头文件?(最好是便携式的,并处理持久性) 目前看起来是这样的: void writeHeader(int width, int height, std::
我学习C++有一段时间了,现在我尝试用STD::OFFROW代替文件*来重写C++函数中的函数。我产生的C++代码看起来很糟糕,不适合使用二进制代码。有没有更好或更合适的方法来编写C++头文件?(最好是便携式的,并处理持久性)
目前看起来是这样的:void writeHeader(int width, int height, std::ofstream file)
{
char bmpSign[2] = {'B', 'M'};
uint filesize = width*height*3+54;
uint reserved = 0;
uint headersize = 54;
uint infoHeader = 40;
ushort colors = 1;
ushort bitsPerPixel = 24;
uint compression = 0;
uint imgSize = width*height*3;
uint xPels = 0;
uint yPels = 0;
uint usedColors = 0;
uint impColors = 0;
file.write(bmpSign, 2*sizeof(char));
file.write(reinterpret_cast<char*>(filesize), sizeof(int));
file.write(reinterpret_cast<char*>(reserved), sizeof(int));
file.write(reinterpret_cast<char*>(headersize), sizeof(int));
file.write(reinterpret_cast<char*>(infoHeader), sizeof(int));
file.write(reinterpret_cast<char*>(width), sizeof(int));
file.write(reinterpret_cast<char*>(height), sizeof(int));
file.write(reinterpret_cast<char*>(colors), sizeof(ushort));
file.write(reinterpret_cast<char*>(bitsPerPixel), sizeof(ushort));
file.write(reinterpret_cast<char*>(compression), sizeof(int));
file.write(reinterpret_cast<char*>(imgSize), sizeof(int));
file.write(reinterpret_cast<char*>(xPels), sizeof(int));
file.write(reinterpret_cast<char*>(yPels), sizeof(int));
file.write(reinterpret_cast<char*>(usedColors), sizeof(int));
file.write(reinterpret_cast<char*>(impColors), sizeof(int));
}
处理平台端性的代码应该重用。该代码与您是使用
FILE*
还是std::fstream
写入数据无关
你唯一需要改变的是
fwrite(bmp_header, 1, 54, bitmap_destination);
可替换为:
file.write(reinterpret_cast<char*>(bmp_header), 54);
file.write(reinterpret\u cast(bmp\u头),54);
您是如何在C版本中“处理endianness”的?请不要将short与sizeof(short)一起使用。。。改为使用(stdint.h):int16_t和sizeof(int16_t),…首先,您的C代码总是使用相同的endianness。你不是在检查机器是大的还是小的(一个简单的测试)。第二,你在C++中编写文件,同时构建缓冲区,然后用C语言一次写。你也应该能够在C++中做这件事。关于处理种子,你也可以使用<代码> HtONLL()/<代码>函数族,从代码> ARPA/IPEN.H./> >这是在大多数POSIX兼容环境中可用的。@ BigBadWolf:是的,看起来是这样。但是在C++版本中,你没有明显的理由就把它删去了。只要把它放回去……就可以为头创建一个struct
,也可以调用sizeof(BmpHeader)
,不?@crush,不。sizeof(BmpHeader)
不太可能是54
,因为struct
@crush的成员变量之间存在填充,我可以肯定地告诉你,这会因为填充而崩溃。您必须使用\uuu declspec(align(1))
或类似的方法声明这样的结构,这是不可移植的。@BigBadWolf nope、msvc、clang,甚至borland和intel编译器似乎也支持这一点。@MateuszGrzejek:一切都是特定于编译器的,真的。甚至是由标准定义的特性。与标准的某些尖端或深奥的特性相比,我更依赖于像pack
和once
这样的通用术语。
file.write(reinterpret_cast<char*>(bmp_header), 54);