C ++将字节串从文件转换为整数

时间:2018-11-17 20:25:58

标签: c++

我对C ++完全陌生,所以我想这可能是一个非常琐碎的问题。如果这是已经回答的问题的重复副本(我敢打赌它是...),请指向该答案!

我有一个文件,其切入自hexdump myfile -n 4

00000000  02 00 04 00 ...    |....|
00000004

尝试读取这些值并将其转换为整数时出现问题/困惑([0200] _hex-> [512] _dec和[0400] _hex-> [1024] _dec)。

基于this answer的最小工作示例:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(void){
    char fn[] = "myfile";
    ifstream file;
    file.open(fn, ios::in | ios::binary);

    string fbuff = "  ";
    file.read((char *)&fbuff[0], 2);
    cout << "fbuff: " << fbuff << endl;

    // works
    string a = "0x0200";
    cout << "a: " << a  << endl;
    cout << "stoi(a): " << stoi(a, nullptr, 16) << endl;

    // doesn't work
    string b = "\x02\x00";
    cout << "b: " << b << endl;
    cout << "stoi(b): " << stoi(b, nullptr, 16) << endl;

    // doesn't work
    cout << "stoi(fbuff): " << stoi(fbuff, nullptr, 16) << endl;

    file.close();
    return(0);
}

我无法理解的是ab之间的区别;前者用0x定义(效果很好),而后者用\x定义并破坏了stoi。我的猜测是,从文件中读取的内容是\x格式,基于在sublime-text3(如下)中运行代码时的输出,我所看到的每个示例仅处理例如{ {1}}格式的输入

0x0200

是否有一种简单的方法来读取两个或多个字节,将它们分组并转换为适当的short / int / long?

1 个答案:

答案 0 :(得分:0)

文字字符串"0x0200"实际上是一个七个字节的数组:

0x30 0x78 0x30 0x32 0x30 0x30 0x00

前六个是ASCII编码的字符,分别用于'0''x''0''2''0''0' 。最后一个是所有字符串都具有的空终止符。

文字字符串"\x00\x02"实际上是三个字节的数组:

0x00 0x02 0x00

实际上,通常不是所谓的“字符串”,而是字节的集合。 std::stoi不能将其解析为字符串。而且由于std::stoi无法对其进行解析,因此该函数将引发异常。

您可能想get a couple of good books to read并了解有关字符串的更多信息。


注意:此答案假设使用ASCII编码和8位字节,这是迄今为止最常见的。