【发布时间】:2019-01-07 16:11:40
【问题描述】:
我有一个二进制文件。我使用 fstream 一次读取 16 个字节。
我想将其转换为整数。我试过了。但它没有用。 在 python 中,我们可以通过使用 stringobtained.encode('utf-8') 将其转换为字节流,然后使用 int(bytestring.hex(),16) 将其转换为 int 来实现。我们应该像在 python 中那样遵循这样的 elloborate 步骤,还是有办法直接转换它?
ifstream file(binfile, ios::in | ios::binary | ios::ate);
if (file.is_open())
{
size = file.tellg();
memblock = new char[size];
file.seekg(0, ios::beg);
while (!file.eof())
{
file.read(memblock, 16);
int a = atoi(memblock); // doesnt work 0 always
cout << a << "\n";
memset(memblock, 0, sizeof(memblock));
}
file.close();
编辑:
这是文件的示例内容。
53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00
04 00 01 01 00 40 20 20 00 00 05 A3 00 00 00 47
00 00 00 2E 00 00 00 3B 00 00 00 04 00 00 00 01
我需要将其读取为 16 个字节,即一次 32 个十六进制数字。(即示例文件内容中的一行)并将其转换为整数。 所以当阅读53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00时,我应该得到,110748049513798795666017677735771517696
但我做不到。即使在尝试 strtoull 之后,我也总是得到 0。我是不是读错了文件,或者我错过了什么。
【问题讨论】:
-
atoi()将 以空结尾的文本字符串 转换为整数。除非您的 16 个字节都将最后一个字节设置为'\0',并且前 15 个字节由前导空格、可选的减号和至少一个介于 '0' 和 '9' 之间的字符组成,否则atoi()将不起作用,因为这就是它的作用,也是它唯一的作用(从技术上讲,'\0' 不一定是最后一个字节,但这不是相关的细节)。 -
int通常为 4 字节,无法存储 16 字节的值。 -
size = file.tellg();我相信这应该返回 0,因为文件刚刚打开。此外,sizeof(memblock)将返回指针的大小,而不是缓冲区的长度。 -
@JohnnyMopp 在我查找
ios::ate所做的事情之前,我一直在做同样的事情。那部分代码没问题。
标签: c++ binaryfiles atoi