我的问题是,我需要加载二进制文件并处理文件中的单个位。之后当然需要将其保存为字节。
我的主要问题是 - 选择什么数据类型来使用 - char还是long int?我能以某种方式使用char吗?
我的问题是,我需要加载二进制文件并处理文件中的单个位。之后当然需要将其保存为字节。
我的主要问题是 - 选择什么数据类型来使用 - char还是long int?我能以某种方式使用char吗?
除非性能对于这里至关重要,否则请使用最容易理解和维护代码的方式。
在开始编写任何代码之前,请确保您理解endianess,c++类型大小以及它们可能会有多么strange。
unsigned char
是唯一的固定大小类型(机器的自然字节,通常为8位)。因此,如果您设计可移植性,那是一个安全的选择。但是,使用unsigned int
甚至long long
来加快处理速度并使用size_of
来查找每个读取中获取的位数也不难,尽管这样代码会变得更加复杂。
这取决于您想要做什么,但一般来说,最好的速度是使用与程序编译相同大小的整数。因此,如果您有一个32位程序,则选择32位整数,如果您有64位,则选择64位。
如果文件中有某些字节或整数,则可能会有所不同。如果不知道文件的确切结构,则很难确定最佳值。
如果你正在处理字节,那么最好的方法是使用特定大小的类型。
#include <algorithm>
#include <iterator>
#include <cinttypes>
#include <vector>
#include <fstream>
int main()
{
std::vector<int8_t> file_data;
std::ifstream file("file_name", std::ios::binary);
//read
std::copy(std::istream_iterator<int8_t>(file),
std::istream_iterator<int8_t>(),
std::back_inserter(file_data));
//write
std::ofstream out("outfile");
std::copy(file_data.begin(), file_data.end(),
std::ostream_iterator<int8_t>(out));
}
编辑修复了错误
<stdint.h>
。(老实说,我想不出一个没有的系统。这是最容易提供的头文件之一。)C++的等效物可能不存在,但这很容易解决。 - Mike DeSimone你的句子并不是真正的正确英语,但就我理解问题而言,你最好使用无符号字符(即字节)类型,以便能够单独修改每个字节。
编辑:根据评论进行了更改。
byte
的定义,所以无法确定它是有符号的还是无符号的。 - Mr Listerchar
,因为它们不能寻址字节。在这些平台上,sizeof(char) == 1
, sizeof(short) == 1
和 sizeof(int) == 2
... - Mike DeSimone<stdint.h>
头文件。它在C和C++中都存在。它定义了诸如uint8_t
(8位无符号整数)之类的类型,这些类型保证在平台上解析为正确的类型。它还告诉其他程序员阅读您的代码时位数很重要。
如果你担心性能问题,你可能想使用大于8位的类型,例如uint32_t
。然而,在读写文件时,你需要注意你系统的字节序。特别是,如果你有一个小端系统(例如x86,大多数ARM),那么32位值0x12345678
将被写入文件作为四个字节0x78 0x56 0x34 0x12
,而如果你有一个大端系统(例如Sparc,PowerPC,Cell,一些ARM和互联网),它将被写入为0x12 0x34 0x56 0x78
。(读取也是如此)。当然,你可以使用8位类型来避免这个问题。