我对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);
}
我无法理解的是a
和b
之间的区别;前者用0x
定义(效果很好),而后者用\x
定义并破坏了stoi。我的猜测是,从文件中读取的内容是\x
格式,基于在sublime-text3(如下)中运行代码时的输出,我所看到的每个示例仅处理例如{ {1}}格式的输入
0x0200
是否有一种简单的方法来读取两个或多个字节,将它们分组并转换为适当的short / int / long?
答案 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位字节,这是迄今为止最常见的。