У меня есть бинарный файл. я читаю 16 байт за раз, используя fstream.
Я хочу преобразовать его в целое число. Я попробовал атои. но это не сработало. В python мы можем сделать это, преобразовав поток байтов, используя stringobtained.encode('utf-8'), а затем преобразовав его в int, используя int(bytestring.hex(),16). Должны ли мы следовать таким сложным шагам, как в python, или есть способ преобразовать его напрямую?
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
Но я не мог этого сделать. Я всегда получаю 0 даже после попытки strtoull. Я неправильно читаю файл или что я упускаю.
atoi()
преобразует текстовую строку, заканчивающуюся нулем, в целое число. Если только в ваших 16 байтах последний байт не установлен на'\0'
, а предыдущие пятнадцать байтов состоят из начальных пробелов, необязательного знака минус и по крайней мере еще одного символа между «0» и «9», тогдаatoi()
не будет работать, потому что это то, что он делает, и единственное, что он делает (технически '\0' не обязательно должен быть последним байтом, но это не важная деталь). - person Sam Varshavchik   schedule 07.01.2019int
обычно составляет 4 байта, которые не могут хранить 16-байтовое значение. - person NathanOliver   schedule 07.01.2019char
, добавьте к нему'\0'
в конце и передайте егоstrtoull()
. Конец. - person Sam Varshavchik   schedule 07.01.2019size = file.tellg();
Я считаю, что это должно вернуть 0, так как файл был только что открыт. Кроме того,sizeof(memblock)
вернет размер указателя, а не длину буфера. - person Johnny Mopp   schedule 07.01.2019ios::ate
. Эта часть кода в порядке. - person Mark Ransom   schedule 08.01.2019.hex()
преобразует 16-байтовую строку в 32 шестнадцатеричных цифры. Целые числа Python не ограничены; нет подходящего типа C++ для этой проблемы. - person Mark Ransom   schedule 08.01.2019