【问题标题】:How to read '00' hex byte from binary file?如何从二进制文件中读取“00”十六进制字节?
【发布时间】:2022-01-17 10:28:39
【问题描述】:

我有一个函数,它将十六进制字符串保存到二进制文件中。

void save_in_binary(std::string& str, std::ofstream& outfile) {
    char buf[3];
    buf[2] = 0;

    std::stringstream input(str);
    input.flags(std::ios_base::hex);
    while (input >> buf[0] >> buf[1]) {
        long val = strtol(buf, nullptr, 16);
        outfile << static_cast<unsigned char>(val & 0xff);
    }
}

另一个,之后会读它

int parse_binary_text(std::string& name, std::string& text) {
    std::ifstream myfile(name, std::ios::binary);

    unsigned int tmp = 0;         // flag
    std::stringstream input;
    if (myfile.is_open()) {
        while (!myfile.eof()) {
            tmp = myfile.get();
            if (tmp == UINT_MAX)
                break;
            input << std::hex << tmp;
        }
        text = input.str();
    }
    else
        return 0;
}

但是在保存十六进制字符串“0FFE00”后,我读取了“FFE0”。似乎我的读取函数跳过了零字节。调试表明当tmp(在代码中标记)等于0时,std::hex什么也不写——这就是问题所在。所以,这提示了我的问题:我该如何解决这个问题?

【问题讨论】:

  • 不要使用while (input) 作为停止条件。而是检查文件结尾。
  • @LouisGo,现在已修复,但不幸的是,它并没有解决问题
  • "但是在保存十六进制字符串 "0FE00" 后,我会读取 "FFE0"" 当您保存该字符串时,您打算输出文件的长度是多少字节?您打算将这些字节的数值设为什么?为什么?你希望得到什么字符串?我不清楚你打算如何将奇数个十六进制数字转换为字节,因为恰好两个这样的数字代表一个字节。
  • 另外:您在void save_in_binary(std::string&amp; str, std::ofstream&amp; outfile) { 中的意图是outfile 已以二进制模式打开,是吗?当您在这样的文件上使用operator&lt;&lt; 时,您期望会发生什么?为什么?你熟悉.write成员函数吗?
  • @KarlKnechtel。我将二进制转换为十六进制,然后将十六进制字节保存在二进制文件中。接下来我试图读取它们并将它们转换回二进制字符串。我使用十六进制编辑器打开了输出文件,它显示0F FE 00 - 这是我正在寻找的输出(间距是可选的)

标签: c++ stl binaryfiles ifstream ofstream


【解决方案1】:

我运行代码,保存十六进制字符串“0FE00”,然后读取“FE0”。对吗?

我将input &lt;&lt; std::hex &lt;&lt; tmp; 修改为input &lt;&lt;std::setw(2)&lt;&lt;std::setfill('0') &lt;&lt; std::hex &lt;&lt; tmp; 以读取“0FE0”。

代码:

#include<string>
#include<sstream>
#include<fstream>
#include<iomanip>
void save_in_binary(std::string& str, std::ofstream& outfile) {
    char buf[3];
    buf[2] = 0;

    std::stringstream input(str);
    input.flags(std::ios_base::hex);
    while (input >> buf[0] >> buf[1]) {
        long val = strtol(buf, nullptr, 16);
        outfile << static_cast<unsigned char>(val & 0xff);
    }
}

int parse_binary_text(std::string& name, std::string& text) {
    std::ifstream myfile(name, std::ios::binary);

    unsigned int tmp = 0;
    std::stringstream input;
    if (myfile.is_open()) {
        while (input) {
            tmp = myfile.get();
            if (tmp == UINT_MAX)
                break;
            input <<std::setw(2)<<std::setfill('0') << std::hex << tmp;
        }
        text = input.str();
    }
    else
        return 0;
}


int main3(int argc, char* argv[]) {
    std::string str = "0FE00",name="test.txt",strget;
    std::ofstream ofs(name, std::ios::binary);
    save_in_binary(str, ofs);
    ofs.close();
    parse_binary_text(name, strget);

【讨论】:

  • 试过你的代码,但不知何故我没有收到“FE0”。尽管如此,输出应该是“FE000”,不等于“FE0”
  • 好的,我认为input &lt;&lt;std::setw(2)&lt;&lt;std::setfill('0') 应该修复,但在你的情况下没有
猜你喜欢
  • 2015-05-15
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 2012-08-20
  • 2020-08-16
相关资源
最近更新 更多