C++ 将从文件读取的二进制数据转换为c+中的字符指针+;
我试图实现将从文件读取的二进制内容连续转换为字节。 我的文件C++ 将从文件读取的二进制数据转换为c+中的字符指针+;,c++,file,hex,binary-data,char-pointer,C++,File,Hex,Binary Data,Char Pointer,我试图实现将从文件读取的二进制内容连续转换为字节。 我的文件samplefile.bin包含16个字节,这是二进制的形式。在未来,它会像这样显示 在本例中,我需要的是以十六进制格式提取这些二进制值,并将其存储到char* 我将把我的示例代码发布到这里 #include <iostream> #include <fstream> #include <iomanip> #include <vector> using namespace std;
samplefile.bin
包含16个字节,这是二进制的形式。在未来,它会像这样显示
在本例中,我需要的是以十六进制格式提取这些二进制值,并将其存储到char*
我将把我的示例代码发布到这里
#include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
using namespace std;
int main()
{
uint8_t *ptr;
long size;
ifstream file ("samplefile.bin", ios::in|ios::binary|ios::ate);
size = file.tellg();
std::vector<uint8_t> memblock(size);
file.seekg (0, ios::beg);
file.read(reinterpret_cast<char*>(&memblock[0]), size);
file.close();
ptr = new uint8_t[size];
int z=0;
for(int i=0; i < memblock.size(); i++)
{
std::cout << memblock.at(i) << ' ';
z=memblock.at(i)&0xff;
ptr[i] = z;
}
cout<<"Output"<<endl;
for (int i=0;i<memblock.size();i++)
{
cout<<ptr[i];
}
delete []ptr;
return 0;
}
我想要下面这样的东西
ptr[0] = 0xCC
ptr[1] = 0x12
...
ptr[15] = 0x4A
当我像这样给出
cout时,读取文件并将其数据复制到char的向量。
您可以使用iomanip,如std::hex或std::uppercase,将整数值打印成十六进制
不建议将原始指针分配并传递给其他函数。只需传递一个char向量或使用unique_ptr,它们就可以防止内存问题
#include <iostream>
#include <iomanip>
std::ifstream file("samplefile.bin", ios::binary);
auto mem = std::vector<char>(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>());
for (char c : mem)
{
std::cout << std::uppercase << std::hex << static_cast<int>(c) << endl;
}
#包括
#包括
std::ifstream文件(“samplefile.bin”,ios::binary);
auto mem=std::vector(std::istreambuf_迭代器(文件),std::istreambuf_迭代器());
for(字符c:mem)
{
std::cout在您的代码中存在多个问题,最基本的事实是,您似乎期望std::byte8_t
在馈送到输出流时默认表示为一个hextdump。事实并非如此。您需要显式地告诉流为您执行必要的格式设置。如果您想存储该表示此外,还需要存储流化结果
许多道路通向罗马,不幸的是C++标准IO流库不能使字节流工作符合人体工程学。但是这里有一种方法:
#include <cstdint>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <vector>
using byte = std::uint8_t;
auto read_bytes(std::istream& is, std::vector<byte>& bytes) -> std::istream& {
return is.read(& reinterpret_cast<char&>(bytes[0]), bytes.size());
}
auto hexdump(std::vector<byte> const& bytes) -> std::string {
auto ostr = std::ostringstream();
ostr << std::uppercase << std::hex << std::setw(2) << std::setfill('0');
for (auto const c : bytes) {
ostr << int{c};
}
return ostr.str();
}
int main(int argc, char** argv) {
if (argc != 2) return 1;
auto fs = std::ifstream(argv[1], std::ios_base::binary | std::ios_base::ate);
auto const size = fs.tellg();
fs.seekg(0);
auto buffer = std::vector<byte>(size);
if (not read_bytes(fs, buffer)) return 1;
std::cout << hexdump(buffer) << "\n";
}
#包括
#包括
#包括
#包括
#包括
#包括
使用byte=std::uint8\u t;
自动读取字节(std::istream&is,std::vector&bytes)->std::istream&{
返回值为.read(&reinterpret_cast(字节[0]),字节.size();
}
自动十六进制转储(std::vector const&bytes)->std::string{
auto ost=std::ostringstream();
ostr向函数传递向量的引用(如果可能的话是常量)。避免按值传递大对象。应该修改第二行以避免赋值。可以使用范围构造函数。也可以使用CTAD和默认初始值设定项。修改为-->std::vector mem(std::istreambuf_迭代器(文件),{})这个函数原型已经被定义了,我们不能改变它。这就是为什么我要求复制内容到<代码> char */COD> Armin,我学习更好的代码感谢你。Vishun,你可以考虑STD::从istreambuf迭代器到原始指针。@第二行在C++14中不执行赋值(甚至在启用优化的C++11中也不执行赋值)。使用auto
完全可以。cout
#include <cstdint>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <vector>
using byte = std::uint8_t;
auto read_bytes(std::istream& is, std::vector<byte>& bytes) -> std::istream& {
return is.read(& reinterpret_cast<char&>(bytes[0]), bytes.size());
}
auto hexdump(std::vector<byte> const& bytes) -> std::string {
auto ostr = std::ostringstream();
ostr << std::uppercase << std::hex << std::setw(2) << std::setfill('0');
for (auto const c : bytes) {
ostr << int{c};
}
return ostr.str();
}
int main(int argc, char** argv) {
if (argc != 2) return 1;
auto fs = std::ifstream(argv[1], std::ios_base::binary | std::ios_base::ate);
auto const size = fs.tellg();
fs.seekg(0);
auto buffer = std::vector<byte>(size);
if (not read_bytes(fs, buffer)) return 1;
std::cout << hexdump(buffer) << "\n";
}