将0x00表示为字符串的文件

Represent a file with 0x00 as a string

本文关键字:文件 字符串 0x00 表示      更新时间:2023-10-16

我想把我的文件表示为字符串,但我遇到了一个问题,文件包含0x00,我的字符串就在那里终止了。如何解决这个问题?

如果不能使用null作为终止字符,则只有很少的选项:

a) 在字符串之前写入字符串大小:005你好011你好\0世界

b) 使用固定长度的字符串

c) 在非终止的null前面加上一个特殊的字符,如"\"。如果字符串中出现"\",请将其写两次"\"。在读回它们时颠倒逻辑。

我有一个二进制文件0x61 0x61 0x00 0x62 0x62 0x62

二进制文件中的"txt文件"?-我不知道这是什么意思。

但是,如果您有用空格分隔的值,您可以尝试使用std::stringstd::vector(不使用空终止)

std::ifstream fin("input.txt");
 std::vector<std::string> v;
 std::copy(std::istream_iterator<std::string> (fin),
           std::istream_iterator<std::string> (), 
           std::back_inserter(v) );
std::vector<std::string>::iterator it =v.begin();
for(;it!=v.end();++it)                       
  std::cout<< *it<<" ";

请确保以二进制模式读取文件:

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
std::string read_file_as_string(const char* filename) {
  std::ifstream input(filename, std::ios::binary);
  if (!input) {
    std::perror("Great failure");
    std::exit(1);
  }
  std::stringstream contents;
  contents << input.rdbuf();
  return contents.str();
}
int main() {
  std::string s = read_file_as_string("Derp.exe");
  std::cout << "s.size() = " << s.size() << 'n';
  for(unsigned char c : s) {
    std::cout << std::hex << static_cast<unsigned int>(c) << ' ';
  }
  std::cout << 'n';
}