Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将从文件读取的二进制数据转换为c+中的字符指针+;_C++_File_Hex_Binary Data_Char Pointer - Fatal编程技术网

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";
}