Edu*_*cio 7 c++ byte bit visual-c++
保留文件字节的最合适的矢量类型是什么?
我正在考虑使用int类型,因为位"00000000"(1字节)被解释为0!
目标是将此数据(字节)保存到文件中,稍后从此文件中检索.
注意:文件包含空字节(以位为"00000000")!
我在这里有点失落.帮我!= D谢谢!
更新I:
要读取我正在使用此功能的文件:
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;
}
Run Code Online (Sandbox Code Playgroud)
注意I:我需要找到一种方法来确保可以从文件中恢复位"00000000"!
注意二:有关将这些位"00000000"保存到文件的安全方法的建议吗?
注3:当使用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);
Run Code Online (Sandbox Code Playgroud)
更新II:
遵循@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;
}
Run Code Online (Sandbox Code Playgroud)
更新III:
这是我用来写二进制文件的代码:
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);
Run Code Online (Sandbox Code Playgroud)
更新IV:
关于UPDATE III的更多内容:
c ++ - 将"std :: vector <unsigned char>"的内容保存到文件中
结论:
绝对解决"00000000"位(1字节)问题的方法是将存储文件字节的类型更改std::vector<unsigned char>为朋友的指导.std::vector<unsigned char>是一种通用类型(存在于所有环境中)并且将接受任何八进制(与"UPDATE I"中的char*不同)!
此外,从数组(char)更改为vector(unsigned char)对于成功至关重要!使用向量,我可以更安全地操作我的数据,并完全独立于其内容(在char数组中我遇到了问题).
非常感谢!
您的代码中有3个问题:
您使用该char类型并返回一个char *. 然而,返回值不是正确的 C 字符串,因为您没有为'\0'终止符分配额外的字节,也没有以 null 终止它。
如果文件可能包含空字节,您可能应该使用 typeunsigned char或uint8_t来明确该数组不包含文本。
您不会将数组大小返回给调用者。调用者无法知道数组有多长。您可能应该使用std::vector<uint8_t>orstd::vector<unsigned char>而不是用 分配的数组new。