c++:使用字节
c++: working with bytes
我的问题是,我需要加载一个二进制文件,并使用该文件中的单个位。在那之后,我当然需要把它保存为字节。
我的主要问题是,选择什么数据类型来使用-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
写入文件,而如果您有大端
- 从不同线程使用int64的不同字节安全吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在UNIX系统中使用DIR查找文件的字节大小
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- std::当在256字节边界上写入整数时,流的奇怪行为
- 当比特(而不是字节)的顺序至关重要时的持久性
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 如何在文件中查找字节序列
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 字节到位运算符重载C++
- 在java中读取c++字节的位字段
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 字节真的是最小可寻址单元吗
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 如何将原始字节附加到 std::vector?
- 基于字节数组生成静态范围整数值