gpt4 book ai didi

c++ - 保存文件字节最合适的 vector 类型是什么?

转载 作者:可可西里 更新时间:2023-11-01 18:35:31 25 4
gpt4 key购买 nike

保存文件字节最合适的 vector 类型是什么?

我正在考虑使用 int 类型,因为位“00000000”(1 个字节)被解释为 0!

目标是将此数据(字节)保存到一个文件中,稍后从该文件中检索。

注意:文件包含空字节(位为“00000000”)!

我有点迷路了。帮我! =D 谢谢!


更新一:

我正在使用这个函数读取文件:

char* readFileBytes(const char *name){
std::ifstream fl(name);
fl.seekg( 0, std::ios::end );
size_t len = fl.tellg();
char *ret = new char[len];
fl.seekg(0, std::ios::beg);
fl.read(ret, len);
fl.close();
return ret;
}

注意 I:我需要找到一种方法来确保可以从文件中恢复位“00000000”!

注意 II:对于将这些位“00000000”保存到文件的安全方法有何建议?

注意 III:当使用 char 数组时,我在为该类型转换位“00000000”时遇到了问题。

代码片段:

int bit8Array[] = {0, 0, 0, 0, 0, 0, 0, 0};
char charByte = (bit8Array[7] ) |
(bit8Array[6] << 1) |
(bit8Array[5] << 2) |
(bit8Array[4] << 3) |
(bit8Array[3] << 4) |
(bit8Array[2] << 5) |
(bit8Array[1] << 6) |
(bit8Array[0] << 7);

更新二:

遵循@chqrlie 的建议。

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <random>
#include <cstring>
#include <iterator>

std::vector<unsigned char> readFileBytes(const char* filename)
{
// Open the file.
std::ifstream file(filename, std::ios::binary);

// Stop eating new lines in binary mode!
file.unsetf(std::ios::skipws);

// Get its size
std::streampos fileSize;

file.seekg(0, std::ios::end);
fileSize = file.tellg();
file.seekg(0, std::ios::beg);

// Reserve capacity.
std::vector<unsigned char> unsignedCharVec;
unsignedCharVec.reserve(fileSize);

// Read the data.
unsignedCharVec.insert(unsignedCharVec.begin(),
std::istream_iterator<unsigned char>(file),
std::istream_iterator<unsigned char>());

return unsignedCharVec;
}

int main(){

std::vector<unsigned char> unsignedCharVec;

// txt file contents "xz"
unsignedCharVec=readFileBytes("xz.txt");

// Letters -> UTF8/HEX -> bits!
// x -> 78 -> 0111 1000
// z -> 7a -> 0111 1010

for(unsigned char c : unsignedCharVec){
printf("%c\n", c);
for(int o=7; o >= 0; o--){
printf("%i", ((c >> o) & 1));
}
printf("%s", "\n");
}

// Prints...
// x
// 01111000
// z
// 01111010

return 0;
}

更新三:

这是我用来写入二进制文件的代码:

void writeFileBytes(const char* filename, std::vector<unsigned char>& fileBytes){
std::ofstream file(filename, std::ios::out|std::ios::binary);
file.write(fileBytes.size() ? (char*)&fileBytes[0] : 0,
std::streamsize(fileBytes.size()));
}

writeFileBytes("xz.bin", fileBytesOutput);

更新四:

进一步阅读UPDATE III:

c++ - Save the contents of a "std::vector<unsigned char>" to a file


结论:

“00000000”位(1 字节)问题的解决方案肯定是将存储文件字节的类型更改为 std::vector<unsigned char>作为 friend 的指导。 std::vector<unsigned char>是一种通用类型(存在于所有环境中)并且将接受任何八进制(与“UPDATE I”中的 char* 不同)!

此外,从数组 (char) 更改为 vector (unsigned char) 对成功至关重要!使用 vector,我可以更安全地操作我的数据,并且完全独立于它的内容(在 char 数组中我遇到了这个问题)。

非常感谢!

最佳答案

使用 std::vector<unsigned char> .不要使用 std::uint8_t :它不会存在于没有恰好 8 位的 native 硬件类型的系统上。 unsigned char永远存在;它通常是硬件支持的最小可寻址类型,并且要求至少为 8 位宽,因此如果您要传输 8 位字节,它将处理您需要的位。

如果您真的非常非常喜欢固定宽度的类型,您可以考虑 std::uint_least8_t ,它将永远存在,并且至少有八位,或 std::uint_fast8_t ,它也有至少八位。但是 char 中的文件 I/O 流量类型和混合 char并且它具有模糊指定的“最少”和“快速”类型的变体可能会让人感到困惑。

关于c++ - 保存文件字节最合适的 vector 类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40050243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com