c++:使用字节

c++: working with bytes

本文关键字:字节 c++      更新时间:2023-10-16

我的问题是,我需要加载一个二进制文件,并使用该文件中的单个位。在那之后,我当然需要把它保存为字节。

我的主要问题是,选择什么数据类型来使用-char或long-int?我能以某种方式使用字符吗?

除非性能在这里是至关重要的,否则请使用任何使代码最容易理解和维护的代码。

在开始编写任何东西之前,请确保您了解endianes、c++类型大小以及它们可能有多奇怪。

unsigned char是唯一一种固定大小的类型(机器的自然字节,通常为8位)。因此,如果你设计的是可移植性,这是一个安全的选择。但是,只使用unsigned int甚至long long来加快进程,并使用size_of来找出每次读取中得到的比特数并不困难,尽管这样代码会变得更复杂。

您应该知道,为了实现真正的可移植性,没有一种c++的内部类型是固定的。一个无符号字符可能有9位,int可能小到0到65535,如这个和这个答案中所述

另一种选择,如user1200129所建议的,是使用boost整数库来减少所有这些不确定性。这是如果你的平台上有可用的提升。尽管如果选择外部库,有许多序列化库可供选择。

但在开始优化之前,首先要做一些简单的工作。然后,当您开始遇到时间问题时,您可以开始分析

这实际上取决于你想要做什么,但我想说的是,一般来说,最好的速度是坚持编译程序时使用的整数的大小。所以,如果你有一个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));
}

EDIT修复了错误

如果需要强制一个整数类型中有多少位,则需要使用<stdint.h>标头。它同时存在于C和C++中。它定义了uint8_t(8位无符号整数)等类型,保证在平台上解析为正确的类型。它还告诉其他阅读代码的程序员,位数很重要。

如果您担心性能,您可能希望使用大于8位的类型,例如uint32_t。但是,在读取和写入文件时,您需要注意系统的endianes。值得注意的是,如果您有一个小端系统(例如x86,大多数都是ARM),那么32位值0x12345678将作为四字节0x78 0x56 0x34 0x12写入文件,而如果您有大端